WuPeng_uin 2022-07-20 16:14 采纳率: 100%
浏览 52
已结题

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填充的内容是随便填的吗?(图中蓝色框)

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

  • 写回答

2条回答 默认 最新

  • 私房菜 移动开发领域优质创作者 2022-07-21 10:04
    关注
    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 函数

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 7月20日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?