问题遇到的现象和发生背景
在看C++的内存对齐,随便写了个例程,遇到了些疑惑的问题,找了资料看也还是很疑惑:
代码:
struct test {
int a; // 4B
short b; // 2B
long long c; // 8B
int d; // 2B
};
int main() {
test t{0, INT16_MAX, 0, INT_MAX};
test t2{INT_MAX, 0, INT64_MAX, 0};
cout << sizeof(struct test) << endl;
return 0;
}
test结构体大小为24B;又用GDB看了一下内存
(gdb) x /64xb &t2
0x1fd77ff7c0: 0xff 0xff 0xff 0x7f 0x00 0x00 0x00 0x00
0x1fd77ff7c8: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x7f
0x1fd77ff7d0: 0x00 0x00 0x00 0x00 0x1f 0x00 0x00 0x00
0x1fd77ff7d8: 0x08 0x19 0x81 0x0f 0xf6 0x7f 0x00 0x00
0x1fd77ff7e0: 0x00 0x00 0x00 0x00 0xff 0x7f 0x00 0x00
0x1fd77ff7e8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x1fd77ff7f0: 0xff 0xff 0xff 0x7f 0xf6 0x7f 0x00 0x00
0x1fd77ff7f8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
有这么两个疑惑的地方:
- t和t2应该都是位于stack区,倒确实是按内存从高位到低位存的,但不是说stack区的内存分配是连续的吗?中间那一段
0x08 0x19 ... 0x00
是什么? - 按照内存对齐规则,test结构体长度得是有效对齐值的整数倍,这里是8,所以到最后的int d结束以后(20B)还得再补4B,使得结构体大小为24B,这4B填充的内容是随便填的吗?(图中蓝色框)
希望有人能帮忙解答,万分感谢