【问题标题】:What is explanation of vars' addresses [duplicate]vars地址的解释是什么[重复]
【发布时间】: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

标签: c++ visual-studio-2017


【解决方案1】:

由您的编译器/实现决定填充,决定堆栈增长的方向,决定是否应将调试数据嵌入到变量中。

C++ 对这个程序的输出没有这样的要求。 “为什么 12 个字节”取决于您选择的编译器、目标架构和使用的编译器标志。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2013-04-03
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多