注:转载于网络
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。
二.字节对齐对程序的影响:
先让我们看几个例子吧(32bit,x86环境,gcc编译器):
设结构体如下定义:
struct A
{
int a;
char b;
short c;
};
4Byte
|---------|
| a |
|----|----|
| b -| c -|
|---------|
struct B
{
char b;
int a;
short c;
};
|--------|
|b |
|--------|
| a |
|--------|
| c |
|--------|
现在已知32位机器上各种数据类型的长度如下:
char:1 (有符号无符号同)
short:2 (有符号无符号同)
int:4 (有符号无符号同)
long:4 (有符号无符号同)
float:4 double:8
那么上面两个结构大小如何呢?
结果是:
sizeof(strcut A)值为8
sizeof(struct B)的值却是12
结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个,B也一样;按理说A,B大小应该都是7字节。之所以出现上面的结果是因为编译器要对数据成员在空间上进行对齐。上面是按照编译器的默认设置进行对齐的结果,那么我们是不是可以改变编译器的这种默认对齐设置呢,当然可以.例如:
#pragma pack (2) /*指定按2字节对齐*/
struct B
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(struct B)值是8。
修改对齐值为1:
#pragma pack (1) /*指定按1字节对齐*/
struct B
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(struct B)值为7。
后面我们再讲解#pragma pack()的作用.
三.编译器是按照什么样的原则进行对齐的?
先让我们看四个重要的基本概念:
1.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
2.结构体的自身对齐值:其成员中自身对齐值最大的那个值。
3.指定对齐值:#pragma pack (value)时的指定对齐值value。
4.数据成员和结构体的有效对齐值:数据成员(数据类型)和数据结构的自身对齐值和指定对齐值中小的那个值。(数据成员对齐了数据结构自然也就对齐了)
分享到:
相关推荐
### C语言中的字节对齐详解 #### 一、引言 字节对齐是C语言编程中的一个重要概念,尤其在处理复杂数据结构时尤为重要。本文将深入探讨字节对齐的基本原理、目的以及如何在实际开发中进行合理配置。 #### 二、字节...
C语言字节对齐问题详解 C语言中的字节对齐问题是指在编译器将C语言程序编译成机器代码时,对变量的存储方式进行调整,以提高存取效率和减少存储空间。字节对齐是指在内存中将变量按照一定的规则排列,以便在访问...
C语言字节对齐不仅仅是一个技术细节问题,它与计算机体系结构密切相关,是软件和硬件协同工作的基础之一。开发者在进行程序设计时,需要对字节对齐的原则有清晰的认识,合理使用这一特性,避免不必要的内存和性能...
### C语言字节对齐详解 #### 一、什么是对齐,以及为什么要对齐 现代计算机内存是由一个个字节组成的,理论上来说,任何类型的变量都可以从任意地址开始存放。但在实际操作中,为了提高访问效率,不同的数据类型...
字节对齐是C语言在数据存储和内存访问效率方面的重要概念。在讲解字节对齐之前,我们首先要了解计算机中的数据存储方式。计算机系统中,数据通常存储在以字节为单位的内存空间中,每个字节拥有独立的地址。字节对齐...
在S2中,c按1字节对齐,S1整体按4字节对齐(S1中最长成员的对齐参数),e按8字节对齐,所以S2的大小为24字节,满足所有成员的对齐要求,并且是8字节的倍数。 总之,C语言中的数据存储对齐是一个涉及内存管理和性能...
内存字节对齐是一种编程实践中遵循的规则,它涉及到如何在计算机内存中安排数据结构的成员,以便提高访问效率和兼容性。理解内存对齐至关重要,因为它直接影响到程序的性能和跨平台兼容性。 首先,我们要明白什么是...
C语言中的字节对齐详解 字节对齐是一种内存存储方式,在现代计算机中,内存空间都是按照byte划分的。在理论上讲,似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定...
在C语言中,结构体的字节对齐是非常重要的,它直接影响着程序的性能和可移植性。本文将详细介绍结构体的字节对齐、指定对齐方式和相关概念。 一、字节对齐的作用和原因 字节对齐是指在计算机内存中,结构体的成员...
在C语言中,内存字节对齐是指编译器为了提高程序执行效率和可移植性,而对结构体成员在内存中的存储方式进行的调整。这个调整是基于体系结构的对齐规则,旨在提高程序的执行效率和可移植性。 在 C 语言中,sizeof ...
C语言字节对齐是软件开发中一个重要的概念,它涉及到计算机硬件、内存管理和程序性能优化。在现代计算机系统中,内存是以字节为基本单位进行分配和访问的,但为了提高数据存取效率和兼容性,数据在内存中通常会按照...
C语言字节对齐__align()讲解[整理].pdf
在IT领域,字节对齐是一项重要的概念,尤其是在编程、数据存储和计算机系统设计中。字节对齐指的是数据在内存或磁盘上的存放位置必须遵循特定的规则,以优化性能和兼容性。这个概念主要涉及到处理器架构、内存管理...
字节对齐是一种编程策略,主要应用于C语言和C++中,目的是为了提高程序执行的效率和内存访问的性能。当结构体中的成员变量在内存中存储时,编译器会根据成员变量的类型和系统架构自动进行字节对齐,确保每个变量都能...
字节对齐作为内存管理的一个重要概念,是指变量在内存中的存储位置必须与该变量的数据类型所要求的对齐方式相匹配。例如,对于一个32位系统来说,如果一个4字节的整型变量被放在了一个非4字节对齐的位置,那么处理器...
C语言结构体的字节对齐原则是指在计算机内存中,按照一定的规则将结构体成员变量排列的原则。这个原则的主要目的是为了提高程序的运行效率和避免硬件平台的限制。 在现代计算机中,内存空间都是按照 byte 划分的。...
例如,在32位编译模式下,默认以4字节对齐;在64位编译模式下,默认以8字节对齐。这样做可以提高寻址效率,避免跨步长存储和提高存取效率。 在C语言中,内存对齐对变量和结构体成员都适用。对于变量,编译器会自动...
在计算机科学领域,字节对齐是一种优化内存访问效率的技术,尤其在C语言和其他底层编程中至关重要。字节对齐的原理是确保数据结构中的每个成员变量都存储在其自然边界上,即按照其数据类型占用的字节数进行对齐。...