【发布时间】:2021-09-10 19:48:22
【问题描述】:
代码如下:
#include <iostream>
using namespace std;
struct S {};
int main() {
S s1, s2;
char c1, c2;
cout << (uintptr_t)&s1 << '\n' << (uintptr_t)&s2 << '\n' << (uintptr_t)&c1 << '\n' << (uintptr_t)&c2 << '\n';
}
输出示例:
19920899
19920887
19920875
19920863
我猜想每个下一个 var 都有更大的地址和 1 个字节的差异,但差异是 12 个字节并且地址正在减少。
【问题讨论】:
-
为什么会这样?就 C++ 而言,地址的值可以是任何值,它们甚至不需要按任何顺序
-
这是我在运行您的代码时得到的。 140735891964644 140735891964645 140735891964646 140735891964647
-
由您的编译器/实现决定填充,决定堆栈增长的方向,决定是否应将调试数据嵌入到变量中。 C++ 对这个程序的输出没有这样的要求。 “为什么 12 个字节” 取决于您选择的编译器和使用的编译器标志。
-
看水晶球这是一个调试版本,它们之间的字节中写入了特定的模式
-
1.在 x86 堆栈上增长到更小的地址。 2.它取决于编译器和它的标志。 gcc 使用构成地址,clang 添加了一些填充(如 msvc):godbolt.org/z/5fEKPoGbd