拿一个很简单的结构体align1为例 1 struct align1 2 { 3 char a; 4 int b; 5 char c; 6 } sim[2]; 如果不考虑任何对齐问题,只考虑结构体中每个成员应该占用的大小,很显然每个结构align1定义的变量是1(char)+4(int)+1(char)共6个字节。但是实际上(至少在windows上)它占用了12个字节,原因就在于它
#include <stdio.h> // 默认对齐 struct DefaultAlign { char a; // 1字节 int b; // 4字节 short c; // 2字节 }; // 使用#pragma pack(1)进行对齐 #pragma pack(1) struct PackedAlign { char a; // 1字节 int b; // 4字节 short c; // 2字节 }; #pragma pack() int main...
struct Foo{ char c;short ns;};int main(){ struct Foo foo;printf("struct size : %d\n",sizeof(foo));printf("struct align : %d\n", alignof(struct Foo));printf("foo addr : %#X\n",&foo);printf("foo.c addr : %#X\n",&foo.c);printf("foo.ns addr : %#X\n",&foo.ns);...
第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足; 第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。 各种类型的变量的align值如下,参考的是wikipedia的页面:...
struct align_basic { char c; int i; double d; }; 那么此时sizeof(align_basic)的值会是sizeof(char)+sizeof(int)+sizeof(double)的值么? 如上图经过测试我们发现其大小为16个字节并不等于1+4+8=13个字节,可知编译器给align_basic结构体插入了另外3个字节,接下来我们将分析编译器对齐字节的规则以及...
struct SIMPLE x; struct SIMPLE y[20],*z; 1. 2. 为结构体变量重命名 typedef struct{ int a; int b; int c; }Simple; Simple x; Simple y[20],*z; 1. 2. 3. 4. 5. 结构成员 结构成员可以是标量、数组、指针甚至是其他结构。
如上图,元素实际仅需要57 Byte空间,由于数据对齐(Align = 4 Byte),变量AoTeMan实际消耗了60 Byte字节空间。 上图我们可以看出:结构体变量元素的内存空间连续排布,因此,各个元素相对起始地址会存在偏移。 工程上如何计算每个元素相对起始位置的偏移呢?计算偏移又有什么用处呢?
#pragma pack (n) struct Natural { char a; int b; char c; }; #pragma pack () 当n 为4、8、16 时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n 为2时,其发挥了作用,使得sizeof(Natural)的结果为6。 通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n 字节...
align.num = 0xeeeeeeee; 我们以为在内存中分布为: age num ff ee ee ee ee 然而: age num ff cc cc cc ee ee ee ee age多出来了3个字节,这里未初始化时填充的是0xcc。假如我们定义成: struct Align { char age; char age1; char age2; ...
例子:__align(),__attribute((aligned (n))),#pragma pack(n) #include <stdio.h>main() {structA {inta;charb;shortc; };structB {charb;inta;shortc; };#pragmapack (2) /*指定按2字节对齐*/structC {charb;inta;shortc; };#pragmapack () /*取消指定对齐,恢复缺省对齐*/#pragmapack (1...