内存对齐

合集下载

四字节

四字节

|--------int--------| 4字节
|char|----|--short-| 4字节
总共占8字节
3.test3
?
typedef struct node2
{
char a;
int b;
short c;
}S2;
则siezof(S3)=12.最长数据类型为int,占4个字节。因此以4字节对齐,其在内存空间存放方式如下:
short b;
static int c;
}S3;
则sizeof(S3)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:
同理,分析上面例子C:
#pragma pack (2) /*指定按2字节对齐*/
struct C {
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
第 一个变量b的自身对齐值为1,指定对齐值为2,所以,其有效对齐值为1,假设C从0x0000开始,那么b存放在0x0000,符合0x0000%1= 0;第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续 字节中,符合0x0002%2=0。第三个变量c的自身对齐值为2,所以有效对齐值为2,顺序存放
例子分析:
分析例子B;
struct B {
char b;

ARM处理器下的内存对齐问题

ARM处理器下的内存对齐问题

ARM处理器下的内存对齐问题介绍内存访问可以分为aligned和未对齐unaligned.对齐内存访问发生在数据分配在natural size boundary,如果这个数据的大小是4 bytes,而且它分配的地址可以被4整除,它就是分配在natural size boundary的,它就是内存对齐的.未对齐内存访问就是其他的所有情况(内存地址不能被4整除);ARM处理器被设计成可以高效的访问对齐数据,在ARM处理器上尝试访问未对齐内存数据将得到两种结果:错误数据或显著的执行差异(很快会讨论这些不同的表现).这不同于其他的CISC类型的处理器,它们可以正常的访问未对齐数据.这篇文档将会描述一些对应用程序来说通用的方式处理未对齐内存访问和提供一些推荐的解决方案以解决这些问题.症状上述问题针对所有ARM架构的.然而,根据MMU是否使能和操作系统的支持,应用程序在不同的平台上有不同的表现.在默认情况下,未对齐内存访问不会被捕捉,而是返回一个错误数据.在使能了MMU的平台上,OS将可以捕捉未对齐内存访问而且在运行时调整正确.返回的结果将是正确的数据,但是将花费 10-20个cpu周期.通常原因类型分配Code:void my_func(char *a){int *b = (int *)a;DBGPRINTF("%d", *b);}这个简单的例子可以生成未对齐内存访问,因为我们不能保证参数char* a是在4字节边界上的.这样的类型定义在任何时候都应该避免.使用数据buffer大多数常见的未对齐内存访问发生在错误的处理数据buffer,这些数据buffer可能包含任何从usb端口,网路,或文件中读取的数据.通常会设置这些数据为packed,意味着没有padding嵌入以确保buffer中的数据是natural size boundary的.在这个例子中,我们将讨论装载从一个文件一个windows BMP格式数据,然后解析其文件头的情况.一个windows BMP文件包含一个以下数据项的文件头,文件头由两个结构体组成:Code:typedef PACKED struct{unsigned short int type;unsigned int size;unsigned short int reserved1, reserved2;unsigned int offset;} HEADER;typedef PACKED struct{unsigned int size;int width,height;unsigned short int planes;unsigned short int bits;unsigned int compression;unsigned int imagesize;int xresolution,yresolution;unsigned int ncolours;unsigned int importantcolours;} INFOHEADER;注意HEADER和INFOHEADER结构体的大小分别是14和40字节.假设我们想在程序运行是检测图片的宽带和高度,得到这些数据的代码如下:Code:#define INFOHEADER_OFFSET (sizeof(HEADER))#define WIDTH_OFFSET (INFOHEADER_OFFSET + offsetof(INFOHEADER, width))#define HEIGHT_OFFSET (INFOHEADER_OFFSET + offsetof(INFOHEADER, height))int imageWidth, imageHeight;void * fileBuf;pMe->mFile = IFILEMGR_OpenFile(pMe->mFileMgr, "test.bmp", _OFM_READ);if (pMe->mFile){IFILE_GetInfo(pMe->mFile, &fileInfo);fileBuf = MALLOC(fileInfo.dwSize);if (fileBuf){result = IFILE_Read(pMe->mFile, fileBuf, fileInfo.dwSize);if (result == fileInfo.dwSize){imageWidth = *((uint32*)(((byte*)fileBuf) + WIDTH_OFFSET));imageHeight = *((uint32*)(((byte*)fileBuf) + HEIGHT_OFFSET));}}}注意宽度和高度的偏移.因为它们位于一个half-word boundary,以上面的代码访问它们的值将是未对齐内存访问.一些推荐的方式解决这个问题如下:推荐方案使用memcpy我们第一个选择是简单的使用memcpy将数据从buffer处理到我们的局部变量中:Code:if (result == fileInfo.dwSize){MEMCPY(&imageWidth,(((byte*)fileBuf)+WIDTH_OFFSET),sizeof(uint32));MEMCPY(&imageHeight,(((byte*)fileBuf)+HEIGHT_OFFSET),sizeof(uint32));}结果是内存被紧密的拷贝,避免了对齐问题.使用PACKED编译指令或者,我们可以使用PACKED编译指令以允许使用指针直接的访问我们想要的数据.也就是强制编译器处理对齐问题.在BREW环境下,PACKED定义如下:Code:#ifdef __ARMCC_VERSION#define PACKED __packed#else#define PACKED#endif通过标明一个指针是PACKED的,ARM编译器将始终生成合适的指令可以正确的访问内存.不管对齐,上边的例子的一个修改的版本,使用PACKED的指针,如下:Code:#define INFOHEADER_OFFSET (sizeof(HEADER))#define WIDTH_OFFSET (INFOHEADER_OFFSET + offsetof(INFOHEADER, width))#define HEIGHT_OFFSET (INFOHEADER_OFFSET + offsetof(INFOHEADER, height))PACKED uint32 * pImageWidth;PACKED uint32 * pImageHeight;uint32 imageWidth, imageHeight;void * fileBuf;pMe->mFile = IFILEMGR_OpenFile(pMe->mFileMgr, "test.bmp", _OFM_READ);if (pMe->mFile){IFILE_GetInfo(pMe->mFile, &fileInfo);fileBuf = MALLOC(fileInfo.dwSize);if (fileBuf){result = IFILE_Read(pMe->mFile, fileBuf, fileInfo.dwSize);if (result == fileInfo.dwSize){pImageWidth = (uint32*)(((byte*)fileBuf) + WIDTH_OFFSET);pImageHeight = (uint32*)(((byte*)fileBuf) + HEIGHT_OFFSET);imageWidth = *pImageWidth;imageHeight = *pImageHeight;}}}定义Well-Aligned数据结构虽然我们一般不能控制定制的数据格式,比如上面例子中的BMP文件头,但是,当我们定义自己的数据结构我们可以将数据设计成Well-Aligned方式.以下例子演示这种方式:Code:#ifdef __ARMCC_VERSIONtypedef PACKED struct{short a; // offsetof(a) = 0int b; // offsetof(b) = 2 ?misalignment problem!short c; // offsetof(c) = 6} BAD_STRUCT;typedef struct{int b; // offsetof(b) = 0 ?no problem!short a; // offsetof(a) = 4short c; // offsetof(c) = 6} GOOD_STRUCT;简单的重新定义结构提成员的顺序,我们可以解决一些对齐问题.同时注意如果BAD_STRUCT没有定义为PACKED,编译器一般将会插入padding以使每个成员是Well-Aligned的.然而,这通常是不可取的,因为它浪费内存,而且几乎总是可以通过按顺序声明减少大小而避免。

计算机内存对齐原理

计算机内存对齐原理

计算机内存对齐原理计算机内存对齐原理是指在计算机系统中,为了提高效率和正确性,数据在内存中的存储会被按照一定的规则进行排列。

这一原理涉及到了计算机硬件和软件的多个层面。

1. **数据对齐(Data Alignment)**:数据对齐是指数据在内存中的存放位置是按照一定的边界进行的。

比如,在许多计算机体系结构中,数据通常按照4字节或8字节的边界对齐。

这意味着数据的地址通常是这些边界数的倍数。

这样做的目的是为了提高数据访问的效率,因为非对齐的访问通常需要额外的硬件指令来处理,这会增加访问时间。

2. **内存访问效率**:当数据在内存中正确对齐时,处理器可以更高效地访问这些数据。

例如,如果处理器一次可以读取4字节,那么它最好是从一个4字节的边界开始访问,这样一次就能读取到整个数据块,而不需要分多次读取。

3. **指令集架构(ISA)的规定**:不同的处理器架构有不同的内存对齐要求。

例如,x86架构就有严格的数据对齐要求,而ARM架构则相对宽松。

软件开发者在编写程序时需要遵循目标处理器的ISA规定。

4. **编译器和操作系统的作用**:现代编译器和操作系统会自动处理内存对齐,以确保数据按照最佳方式存储。

它们会根据目标处理器的特点来优化代码,包括数据的内存布局。

5. **性能考量**:虽然内存对齐可以提高性能,但它也可能增加内存的使用量。

因为为了对齐数据,可能需要在数据前后填充一些无用的字节,这被称为填充(Padding)。

因此,在设计数据结构时,开发者需要在性能和内存使用之间做出权衡。

内存对齐是计算机体系结构中的一个重要概念,它影响着程序的性能和效率。

程序员在编写代码时应当了解并遵循内存对齐的原则,以优化程序的运行速度。

同时,内存对齐也是操作系统和编译器优化代码的一个重要方面。

如何通过内存对齐提高程序性能

如何通过内存对齐提高程序性能

内存对齐是一种优化程序性能的重要手段。

它可以使得数据在内存中的存储更加紧凑和高效,减少内存访问的次数和开销,从而提高程序的运行速度。

本文将从什么是内存对齐、为何需要内存对齐以及如何通过内存对齐提高程序性能等方面展开论述。

一、什么是内存对齐内存对齐是指内存中的数据在存储时按照一定的规则对齐,如按字节对齐、按字对齐等。

在现代计算机中,数据访问通常以字节为单位进行,而内存对齐能够使得数据的存储地址整除数据类型的大小。

例如,一个int类型的变量通常占用4个字节,内存对齐能够保证它存储的地址是4的倍数,而不是随机的地址。

二、为何需要内存对齐内存对齐的主要目的是提高数据存取的效率。

当数据按照字节对齐存储时,CPU在访问内存时无需额外的计算和操作,可以直接通过内存地址来获取数据,加快访问速度。

相反,如果数据没有对齐存储,CPU就需要进行额外的位移和掩码操作,这会造成额外的时间和开销。

三、内存对齐的原则1. 基本类型的变量,如int、float,通常按照其本身的大小进行对齐。

例如,一个int类型的变量通常按照4字节对齐存储。

2. 结构体的对齐规则通常是按照最大成员的大小进行对齐。

例如,一个结构体中最大的成员是8字节的double类型变量,那么结构体就按照8字节对齐存储。

3. 编译器一般会对结构体进行填充,以满足对齐的要求。

这样可以使得结构体的大小是对齐大小的整数倍,从而提高内存访问的效率。

4. 对于特殊情况和对齐要求更高的场景,可以使用编译器提供的对齐指令来自定义对齐规则。

四、如何通过内存对齐提高程序性能1. 减少内存访问次数:由于内存对齐可以使得数据在内存中的存储更加紧凑,减少了数据的分散存储,从而可以减少内存访问的次数。

对于大型数据结构或数组,内存对齐能够显著提升对内存的访问效率,加快程序的运行速度。

2. 提高缓存命中率:CPU的高速缓存是一个重要的性能瓶颈,内存对齐可以提高缓存命中率。

当数据按照对齐规则存储时,缓存可以更好地预取和预存储数据,减少了对主存的访问次数,从而提高程序的运行效率。

内存对齐原则

内存对齐原则

内存对齐原则内存对齐原则是计算机科学中一个非常重要的概念,它在程序运行过程中起着至关重要的作用。

内存对齐是指数据在内存中存储时按照一定的规则对齐到特定的地址上,以提高程序的运行效率。

在计算机中,数据的存储是以字节为单位的,每个数据类型在内存中占用的字节数是不同的。

而内存对齐原则就是要求数据类型的起始地址必须是其大小的整数倍。

比如,一个int类型通常占用4个字节,那么它的起始地址必须是4的倍数。

为什么需要内存对齐呢?这是因为计算机在访问内存时,通常是以字为单位进行读取的。

如果数据没有按照规则对齐存储,那么就会导致额外的内存访问,从而影响程序的运行效率。

因此,遵守内存对齐原则能够减少内存访问次数,提高程序的运行速度。

在实际编程中,我们可以通过一些手段来保证数据的内存对齐。

比如,可以使用结构体来定义数据类型,结构体中的数据成员会按照定义的顺序依次存储在内存中,并且会根据最大数据类型的字节数进行对齐。

另外,编译器也会对数据进行自动对齐,以保证程序的正确性和效率。

除了结构体外,我们还可以使用#pragma pack指令来设置数据的对齐方式。

这个指令可以指定数据的对齐字节数,从而实现更灵活的内存对齐方式。

但是需要注意的是,过度使用#pragma pack可能会导致内存浪费,因此需要谨慎使用。

总的来说,内存对齐原则是计算机编程中一个非常重要的概念,它可以提高程序的运行效率,减少内存访问次数。

在编写程序时,我们应该遵守内存对齐原则,合理设计数据结构,以提高程序的性能和稳定性。

同时,我们也要注意内存对齐可能带来的内存浪费问题,尽量在保证效率的前提下减少内存的占用。

希望大家能够深入理解内存对齐原则,从而写出高效的程序,提升自己的编程水平。

内存对齐规则

内存对齐规则

内存对齐规则内存对齐是计算机系统中的一个重要概念,它指的是在内存中存储数据时,数据在内存中的起始地址必须是特定值的倍数。

这个特定值称为对齐单位。

内存对齐的存在是为了提高计算机系统的性能和效率。

本文将介绍内存对齐的规则和作用,并探讨其在计算机系统中的重要性。

一、内存对齐的规则在计算机系统中,内存对齐遵循以下规则:1. 基本对齐规则:数据的起始地址必须是其数据类型的整数倍。

例如,一个整型变量的起始地址必须是4的倍数,一个双精度浮点型变量的起始地址必须是8的倍数。

2. 结构体对齐规则:结构体中的成员变量按照其数据类型的对齐方式进行对齐。

结构体的起始地址必须是其成员变量中对齐要求最高的数据类型的整数倍。

3. 数组对齐规则:数组的起始地址必须是数组元素类型的对齐要求最高的数据类型的整数倍。

4. 结构体嵌套对齐规则:结构体嵌套时,内层结构体的起始地址必须是外层结构体中对齐要求最高的数据类型的整数倍。

二、内存对齐的作用内存对齐的主要作用是提高计算机系统的性能和效率。

具体而言,内存对齐可以带来以下好处:1. 提高访问速度:对齐的数据可以直接从内存中读取,而不需要进行额外的对齐操作。

这样可以减少内存访问的时间,提高程序的执行效率。

2. 节省内存空间:内存对齐可以使数据在内存中的布局更加紧凑,减少内存碎片的产生。

这样可以节省内存空间,提高内存的利用率。

3. 硬件兼容性:不同的硬件平台对内存对齐的要求可能不同。

遵循内存对齐规则可以增加程序在不同硬件平台上的兼容性,减少因为内存对齐问题而导致的程序错误。

三、内存对齐的重要性内存对齐在计算机系统中具有重要的意义。

首先,内存对齐可以提高程序的执行效率,减少内存访问的时间,提高计算机系统的性能。

其次,内存对齐可以减少内存碎片的产生,节省内存空间,提高内存的利用率。

此外,遵循内存对齐规则可以增加程序在不同硬件平台上的兼容性,提高程序的可移植性。

总结起来,内存对齐是计算机系统中的一个重要概念,它可以提高计算机系统的性能和效率。

内存对齐

内存对齐

内存对齐.txt2机会靠自己争取,命运需自己把握,生活是自己的五线谱,威慑呢们不亲自演奏好它?最近被面试了,打击挺大,问啥啥不会。

举一个很多不会的题中的一个,关于内存对齐的问题,以前也知道点,个人感觉很重要,在这里与同道中人分享下:很多书籍中都讲到:内存可以看成一个byte数组,我们通过编程语言提供的工具对这个'大数组'中的每个元素进行读写,比如在C中我们可以用指针一次读写一个或者更多个字节,这是我们一般程序员眼中的内存样子。

但是从机器角度更具体的说从CPU角度看呢,CPU发出的指令是一个字节一个字节读写内存吗?答案是'否'。

CPU是按照'块(chunk)'来读写内存的,块的大小可以是2bytes, 4bytes, 8bytes, 16bytes甚至是32bytes. 这个CPU访问内存采用的块的大小,我们可以称为'内存访问粒度'。

程序员眼中的内存样子:---------------------------------| | | | | | | | | | | | | | | | |---------------------------------0 1 2 3 4 5 6 7 8 9 A B C D E F (地址)CPU眼中的内存样子:(以粒度=4为例)---------------------------------------------| | | | | | | | | | | | | | | | | | | |---------------------------------------------0 1 2 3 4 5 6 7 8 9 A B C D E F (地址)有了上面的概念,我们来看看粒度对CPU访问内存的影响。

假设这里我们需要的数据分别存储于地址0和地址1起始的连续4个字节的存储器中,我们目的是分别读取这些数据到一个4字节的寄存器中,如果'内存访问粒度'为1,CPU从地址0开始读取,需要4次访问才能将4个字节读到寄存器中;同样如果'内存访问粒度'为1,CPU从地址1开始读取,也需要4次访问才能将4个字节读到寄存器中;而且对于这种理想中的''内存访问粒度'为1的CPU,所有地址都是'aligned address'。

内存对齐规则

内存对齐规则

内存对齐规则在计算机科学中,内存对齐是指将数据结构的起始地址设置为按照特定规则对齐的地址。

这个规则是为了优化内存的访问效率和提高计算机的性能。

下面将详细介绍内存对齐的规则以及它的作用。

1. 内存对齐的基本原则内存对齐的基本原则是将数据结构按照其大小进行对齐。

对齐的目的是为了保证数据结构的每个成员在内存中的地址都是对齐的,这样可以提高内存的读写效率。

通常情况下,数据结构的对齐方式与平台的硬件架构有关,如x86架构的对齐方式与ARM架构的对齐方式可能不同。

2. 内存对齐的规则内存对齐的规则是根据数据结构的大小来确定的。

以下是常见的内存对齐规则:- 字节对齐:数据结构的起始地址必须是其大小的整数倍。

例如,一个4字节大小的数据结构的起始地址必须是4的倍数。

- 短整型对齐:短整型数据结构的起始地址必须是2的倍数。

- 整型对齐:整型数据结构的起始地址必须是4的倍数。

- 长整型对齐:长整型数据结构的起始地址必须是8的倍数。

- 双精度浮点型对齐:双精度浮点型数据结构的起始地址必须是8的倍数。

3. 内存对齐的作用内存对齐可以提高计算机的性能和内存的访问效率。

首先,对齐的数据结构可以使计算机一次读取或写入多个连续的内存地址,减少了读写操作的次数,提高了内存访问的速度。

其次,对齐的数据结构可以减少内存碎片的产生,提高内存的利用率。

最后,对齐的数据结构可以避免由于内存对齐不当而引起的数据错误和性能下降。

4. 内存对齐的注意事项在进行内存对齐时,需要注意以下几点:- 结构体中的成员变量的声明顺序会影响内存的对齐方式。

通常情况下,将大小相同的成员变量放在一起可以减少内存的浪费。

- 在某些特殊情况下,可以使用特定的编译指令来控制内存对齐的方式,以满足特定的需求。

- 内存对齐可能会增加内存的消耗,特别是在数据结构中存在大量的填充字节的情况下。

因此,在设计数据结构时,需要权衡内存利用率和性能之间的关系。

总结起来,内存对齐是为了提高内存的读写效率和计算机的性能而进行的一种优化技术。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近被面试了,打击挺大,问啥啥不会。

举一个很多不会的题中的一个,关于内存对齐的问题,以前也知道点,个人感觉很重要,在这里与同道中人分享下:
很多书籍中都讲到:内存可以看成一个byte数组,我们通过编程语言提供的工具对这个'大数组'中的每个元素进行读写,比如在C中我们可以用指针一次读写一个或者更多个字节,这是我们一般程序员眼中的内存样子。

但是从机器角度更具体的说从CPU角度看呢,CPU发出的指令是一个字节一个字节读写内存吗?答案是'否'。

CPU是按照'块(chunk)'来读写内存的,块的大小可以是2bytes, 4bytes, 8bytes, 16bytes甚至是32bytes. 这个CPU访问内存采用的块的大小,我们可以称为'内存访问粒度'。

程序员眼中的内存样子:
---------------------------------
| | | | | | | | | | | | | | | | |
---------------------------------
0 1 2 3 4 5 6 7 8 9 A B C D E F (地址)
CPU眼中的内存样子:(以粒度=4为例)
---------------------------------------------
| | | | | | | | | | | | | | | | | | | |
---------------------------------------------
0 1 2 3 4 5 6 7 8 9 A B C D E F (地址)
有了上面的概念,我们来看看粒度对CPU访问内存的影响。

假设这里我们需要的数据分别存储于地址0和地址1起始的连续4个字节的存储器中,我们目的是分别读取这些数据到一个4字节的寄存器中,
如果'内存访问粒度'为1,CPU从地址0开始读取,需要4次访问才能将4个字节读到寄存器中;
同样如果'内存访问粒度'为1,CPU从地址1开始读取,也需要4次访问才能将4个字节读到寄存器中;而且对于这种理想中的''内存访问粒度'为1的CPU,所有地址都是'aligned address'。

如果'内存访问粒度'为2,CPU从地址0开始读取,需要2次访问才能将4个字节读到寄存器中;每次访存都能从'aligned address'起始。

如果'内存访问粒度'为2,CPU从地址1开始读取,相当于内存中数据分布在1,2,3,4三个地址上,由于1不是'aligned address',所以这时CPU要做些其他工作,由于这四个字节分步在三个chunk上,所以CPU需要进行三次访存操作,第一次读取chunk1(即地址0,1上两个字节,而且仅仅地址1上的数据有用),第二次读取chunk2(即地址2,3上两个字节,这两个地址上的数据都有用),最后一次读取chunk3(即地址5,6上两个字节,而且仅仅地址5上的
数据有用),最后CPU会将读取的有用的数据做merge操作,然后放到寄存器中。

同理可以推断如果'内存访问粒度'为4,那么从地址1开始读取,需要2次访问,访问后得到的结果merge后放到寄存器中。

是不是所有的CPU都会帮你这么做呢,当然不是。

有些厂商的CPU发现你访问unaligned address,就会报错,或者打开调试器或者dump core,比如sun sparc solaris绝对不会容忍你访问unaligned address,都会以一个core结束你的程序的执行。

所以一般编译器都会在编译时做相应的优化以保证程序运行时所有数据都是存储在'aligned address'上的,这就是内存对齐的由来。

我们可以指定按照何种粒度访问特定内存块儿:其中void *T为指向特定内存块的地址指针char *p = (char*)T;每次操作一个字节
short *p = (short*)T;每次操作两个字节
int *p = (int*)T;每次操作4个字节
以此类推。

在'Data alignment: Straighten up and fly right'这篇文章中作者还得出一个结论那就是:"如果访问的地址是unaligned的,那么采用大粒度访问内存有可能比小粒度访问内存还要慢"。

我试验用的编译器包括GCC 3.4.2和VC6.0的C编译器,平台为Windows XP + Sp2。

我们将用典型的struct对齐来说明。

首先我们定义一个struct:
#pragma pack(n)
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack(n)
首先我们首先确认在试验平台上的各个类型的size,经验证两个编译器的输出均为:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
我们的试验过程如下:通过#pragma pack(n)改变“对齐系数”,然后察看sizeof(struct test_t)的值。

1、1字节对齐(#pragma pack(1))
输出结果:sizeof(struct test_t) = 8 [两个编译器输出一致]
分析过程:
1) 成员数据对齐
#pragma pack(1)
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack()
成员总大小=8
2) 整体对齐
整体对齐系数 = min((max(int,short,char), 1) = 1
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 8 [注1]
2、2字节对齐(#pragma pack(2))
输出结果:sizeof(struct test_t) = 10 [两个编译器输出一致]
分析过程:
1) 成员数据对齐
#pragma pack(2)
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack()
成员总大小=10
2) 整体对齐
整体对齐系数 = min((max(int,short,char), 2) = 2
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 10
3、4字节对齐(#pragma pack(4))
输出结果:sizeof(struct test_t) = 12 [两个编译器输出一致]
分析过程:
1) 成员数据对齐
#pragma pack(4)
struct test_t {
int a;
char b;
short c;
char d;
};。

相关文档
最新文档