在看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
有这么两个疑惑的地方:
0x08 0x19 ... 0x00
是什么?希望有人能帮忙解答,万分感谢
第一个,当你定义变量t 并初始化它的时候,系统不是只有你这一个程序,后面还有别的程序在跑,那么就有可能同时申请内存
这样,0x1fd77ff7c0 刚分配给了 t的同时,0x1fd77ff7d8 这个内存给了另外一个程序的变量了。
所以,出现了,你看到的t 和 t2 不连续的情况。。。。
第二个,当你定义一个变量t 或者 t2 的时候,系统会分配一个连续的内存给你,但是,这个内存之前是谁用的,你不清楚,你唯一清楚的时候,这个内存别人之前用过了,并且释放了。。。。
那么,这个刚被变量t 拿到的内存,就有可能之前被别人填充过数据,所以,当前看到蓝色框中的部分是脏数据,很正常,也无所谓,因为你在引用的时候都是通过变量t 或t2 引用其成员变量,是访问不到这一块数据。。。。
同理,如果是堆上申请的内存,也是如此的。。。
但是,建议你在使用变量的时候,统统都初始化一下,例如memset 函数
希望对你有所帮助,如果有其他的问题,欢迎随时交流~~~~
可能中间那一块提前已经分配给别的变量了吧
内存对齐会占用一些内存,这些内存原来存的是什么就是什么