如果堆栈在数字较低的地址处增长,为什么指针比较会逆转呢?

Nik*_*kos 1 c++ heap stack design-decisions memory-address

由于堆栈向下增长,即朝数字较小的内存方向扩展,所以这&i < &j是正确的。如果我错了,请指正我,但是我想这是C创建者(由C ++维护)的设计决策。但是我不知道为什么。

同样奇怪的是,堆分配的对象pin位于数值上比堆栈变量高的内存地址,这也与以下事实相矛盾:堆位于数值上比堆栈小(且向上递增)。

#include <iostream>

int main()
{
    int i = 5;                  // stack allocated
    int j = 2;                  // stack allocated
    int *pi = &i;               // stack allocated
    int *pj = &j;               // stack allocated

    std::cout << std::boolalpha << '\n';
    std::cout << (&i < &j) && (pi < pj) << '\n';            // true
    struct S
    {
        int in;
    };
    S *pin                      // stack allocated
        = new S{10};            // heap allocated
    std::cout << '\n' << (&(pin->in) > &i) << '\n';         // true
    std::cout << ((void*)pin > (void*)pi) << '\n';          // true
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我是对的,如果是这样,为什么C设计人员会扭转这种情况,即数字较小的内存地址看起来会更高(至少当您比较指针或通过addressof运算符时&)。这仅仅是为了“使事情正常”吗?

eer*_*ika 8

如果我错了,请纠正我,但我想这是C创作者的设计决定

它不是C语言或C ++设计的一部分。实际上,这些标准不存在诸如“堆”或“堆栈”内存之类的东西。

这是一个实现细节。每种语言的每种实现方式可能会有所不同。


指向不相关对象(例如&i < &j或(void*)pin > (void*)pi具有未指定结果)的指针之间的有序比较。任何一个都不能保证小于或大于另一个。

对于它的价值,您的示例程序在我的系统上输出三个“ false”计数。


Sco*_*ter 7

编译器生成的代码不是按顺序为每个单独的变量分配空间,而是为这些局部变量分配一个块,因此可以根据自己的选择将它们安排在该块中。