当前位置: 技术问答>linux和unix
struct 结构内存对齐问题.
来源: 互联网 发布时间:2016-12-17
本文导语: 代码如下: struct test{ unsigned int test1; //4b unsigned int test2; //4b unsigned char c1; //1b unsigned short int test3; //2b char c2; //1b }; ...
代码如下:
奇怪的是输出的是16而不是12.
为什么会这样呢.
struct test{
unsigned int test1; //4b
unsigned int test2; //4b
unsigned char c1; //1b
unsigned short int test3; //2b
char c2; //1b
}; //总共=12b ;__attribute__((packed))不使用内存对齐
int main(int argc, char* argv[])
{
printf("%d n",sizeof(struct test));
return 0;
}
奇怪的是输出的是16而不是12.
为什么会这样呢.
|
unsigned char c1; //1b
-->这里填充额外的3 bit,共占4b。
unsigned short int test3; //2b
char c2; //1b
-->这里填充1 bit,与test3共占4b
这个结构体就有了4个4 bit,共16 bit。
根据楼主描述而猜测,暂未实际测试验证过。
-->这里填充额外的3 bit,共占4b。
unsigned short int test3; //2b
char c2; //1b
-->这里填充1 bit,与test3共占4b
这个结构体就有了4个4 bit,共16 bit。
根据楼主描述而猜测,暂未实际测试验证过。
|
在C专区看到的
字节对齐的三个原则
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)
字节对齐的三个原则
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)