【问题标题】:C++ gap between arrays in stack堆栈中数组之间的C ++间隙
【发布时间】:2019-01-18 22:38:09
【问题描述】:

这段代码的输出:

int a;
int b;
cout<<"a: "<<&a<<endl;
cout<<"b: "<<&b<<endl;

是:

a: 0x6ffe4c
b: 0x6ffe48

有道理,它们之间应该相差4个字节,但是这段代码的输出:

int A[1];
int B[1];
cout<<"A: "<<A<<endl;
cout<<"B: "<<B<<endl;

是:

A: 0x6ffe40
B: 0x6ffe30

所以现在差异是 16 个字节,谁能解释为什么?为什么需要这个差距?当您像这样分配数组时,我不知道堆栈中存在间隙,并认为在这种情况下 B[1] 与 A[0] 相同。

【问题讨论】:

  • 你使用哪个编译器?
  • GCC的Mingw端口
  • 版本?也许编译器将 int 数组对齐到 16,因此它可以为它们生成对齐的 SSE 加载指令(但这对您的情况没有用,因为数组大小为 1)。

标签: c++ arrays pointers stack mingw


【解决方案1】:

C 和 C++ 都不保证自动变量在内存中的顺序,或者它们之间的任何填充。这些是特定编译器的实现细节。

【讨论】:

  • 投反对票的人可能想指出他们不同意这个简短答案中的哪个句子。
  • 问题是:“谁能解释为什么?为什么需要这个差距?”。您的回答对回答这些问题没有用处。
【解决方案2】:

为了解释您的实例中的数组变量之间的间隙,您需要研究 GNU C++ 编译器如何为变量分配内存。变量的分配取决于编译器。

变量之间存在差距的一些原因(不包括在内):

对齐

当处理器可以从与其字长对齐的地址中获取时,它们的效率会更高。例如,具有 32 位字的处理器喜欢从 4 字节对齐的地址中获取。从地址 5 访问 32 位需要两次提取,然后进行一些字节移位以将字节按正确顺序放置。

数据段

常量变量可以放在可执行文件或只读数据段中。它可以在读/写变量旁边声明,因此它们之间有一个间隙日志。

溢出空间

编译器可以在数组之后分配空间以提供“缓冲”以防数组溢出。

元信息

编译器可以选择将关于数据类型的属性(元)信息放在数据类型之后(或之前)。例如,当为数组动态分配内存时,编译器可能会选择将分配的大小放在数组附近(对于恢复内存很有用)。

寄存器

编译器可以将变量放在寄存器中。因此变量将具有不同的地址,因为寄存器通常不在同一个内存映射中;尽管有些处理器具有内存映射寄存器。

解析

变量可以分配在便于解析的位置。编译器可能会延迟变量分配,直到方便为止,或者在优化过程中可能会更改位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2022-08-18
    • 2010-12-04
    • 2016-03-18
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多