直接用腾讯的校招笔试题做例子说明吧:
32位机下:
struct test{
long long int t1;
char c;
int i;
char arr[2];
static int iv;
};
int test::iv=0;
求sizeof(test).
如果你考虑的是在VC/VS环境下,你的答案不是24,请继续往下看:
如果你考虑的是在gcc/g++编译环境下,你的答案不是16,请继续往下看:
long long int :8字节
char: 1字节
int :4字节
char 数组:2字节
static数据放置在全局区,不算入该结构体的大小中。
vc编译器下:struct的成员按照声明的顺序分配内存,并且某类型的起始地址必须能被该类型所占字节数整除。struct 的对齐方式是按照最宽字节的成员的字节数对齐,所以该结构体按8字节对齐,所以是:
8字节(long)
1(char)+3字节(补齐) 4字节(int)
2字节(char arr【2】)+6字节(补齐)
所以一共是24字节
而在gcc/g++编译器下,struct的成员并不一定按照声明顺序分配内存,而是做了一定的优化。首先存字节较宽的成员比如long long,int。对齐方式仍是按照最宽字节的成员的字节数对齐。所以内存情况应为如下:
8字节(long long)
4字节(int) 1字节 (char) 2字节(char arr【2】) 1字节(补齐)
所以一共是16字节。
学习笔记,仅供参考。如果疑问,欢迎讨论