结构体的大小

来源:互联网 发布:爱思唯尔数据库英文 编辑:程序博客网 时间:2024/05/02 07:17

当定义了结构体以后,编译器在编译的时候遵循两条原则:

1、结构体变量中成员的偏移量必须是成员大小的整数倍。(0被认为是任何数的整数倍)

2、结构体的大小必须是所有成员大小的整数倍。

e.g.

strut c

{

int i;

char x;

int j;

};


其中,i的偏移量是0,x的偏移量是sizeof(i) + 0 = 4, j的偏移量是 4 + 1 = 5。

所以根据第一条,j的偏移量在编译的时候被改成5+3=8, 所以c的大小是8 + 4 = 12。

注意也有时候是满足第一条,不满足第二条的时候,尤其是在只有两个成员的时候。


结构体中带有结构体的情况是不一样的,结构体中若还有结构体,就直接将结构体展开,但是展开的结构体中第一个成员的偏移量必须是自己所在结构体(原来的)中最大的成员的整数倍。


但是需要注意的是其会根据编译器的不同有所不同,以上情况在linux g++上测试通过。

注意,若结构体中有函数的话,只要不是虚函数,其都是不占内存的,虚函数需要占4个字节的空间。

原创粉丝点击