C 语言下(x86-64),同个函数下的变量可能会不连续吗?

2020-04-05 17:20:45 +08:00
 8e47e42

遇到一个很古怪的问题: 例子:

{
... //一些其他代码
	int apple = 1; //Addr: a
	int* apple_ptr = &apple ; //Addr: 预计=a-8,实际=a-12
	int** apple_ptr_ptr = &apple_ptr; //Addr: 预计=a-16,实际=a-24
}

所以地址实际和预期之间的差距一般是什么原因造成的呢?

1303 次点击
所在节点    问与答
6 条回复
FujiZ
2020-04-05 17:25:15 +08:00
需要考虑 padding
Mohanson
2020-04-05 17:31:03 +08:00
内存对齐的缘故?把 apple 改成 usize64 应该能得到你想要的结果,猜的
lance6716
2020-04-05 17:34:57 +08:00
gdb 看看不就不用猜了吗
unixeno
2020-04-05 19:18:25 +08:00
这个完全是编译器实现的行为
你用不同的优化等级编译出来的结果可能都不同
msg7086
2020-04-05 19:32:35 +08:00
为啥能预计?
内存变量分配也不是写在规范里的呀。
对齐,插调试信息,优化,都可能造成变量不相邻。
tairan2006
2020-04-05 19:33:35 +08:00
这里完全无法预期啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX