C++内存对齐的疑惑

问题遇到的现象和发生背景

在看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

img

有这么两个疑惑的地方:

  • t和t2应该都是位于stack区,倒确实是按内存从高位到低位存的,但不是说stack区的内存分配是连续的吗?中间那一段0x08 0x19 ... 0x00是什么?
  • 按照内存对齐规则,test结构体长度得是有效对齐值的整数倍,这里是8,所以到最后的int d结束以后(20B)还得再补4B,使得结构体大小为24B,这4B填充的内容是随便填的吗?(图中蓝色框)

希望有人能帮忙解答,万分感谢

  1. 你定义了两个变量,都是栈上的,一个是t,一个t2
  2. 你定义的两个是结构体变量,内存是连续的
  3. 内存对齐是按8个byte 对齐,所以,结构体变量占用的内存时 24个Bytes,其中int a;和 short b;共用第一个8bytes;
  4. 变量t 的内存地址是:0x1fd77ff7c0,变量t2 的内存地址是:0x1fd77ff7e8
    ok~~~~下面来解决你提的两个问题。。。。

第一个,当你定义变量t 并初始化它的时候,系统不是只有你这一个程序,后面还有别的程序在跑,那么就有可能同时申请内存
这样,0x1fd77ff7c0 刚分配给了 t的同时,0x1fd77ff7d8 这个内存给了另外一个程序的变量了。
所以,出现了,你看到的t 和 t2 不连续的情况。。。。
第二个,当你定义一个变量t 或者 t2 的时候,系统会分配一个连续的内存给你,但是,这个内存之前是谁用的,你不清楚,你唯一清楚的时候,这个内存别人之前用过了,并且释放了。。。。
那么,这个刚被变量t 拿到的内存,就有可能之前被别人填充过数据,所以,当前看到蓝色框中的部分是脏数据,很正常,也无所谓,因为你在引用的时候都是通过变量t 或t2 引用其成员变量,是访问不到这一块数据。。。。
同理,如果是堆上申请的内存,也是如此的。。。
但是,建议你在使用变量的时候,统统都初始化一下,例如memset 函数

希望对你有所帮助,如果有其他的问题,欢迎随时交流~~~~

可能中间那一块提前已经分配给别的变量了吧
内存对齐会占用一些内存,这些内存原来存的是什么就是什么