c++ - 如果堆栈在数值较低的地址增长,为什么指针比较会反转它?

标签 c++ stack heap-memory memory-address design-decisions

由于堆栈向下增长,即向数字较小的内存地址增长,为什么 &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
}

到目前为止我是对的吗?如果是的话,为什么 C 设计者扭转了这种情况,即数值较小的内存地址显得更高(至少当您比较指针或通过 addressof 运算符 & 时)。这样做只是为了“让事情顺利进行”吗?

最佳答案

Correct me if I'm wrong, but I'd imagine this was a design decision of C creators

它不是C语言设计的一部分,C++也不是。事实上,不存在这些标准认可的“堆”或“堆栈”内存。

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


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

就其值(value)而言,您的示例程序在我的系统上输出了三个“false”计数。

关于c++ - 如果堆栈在数值较低的地址增长,为什么指针比较会反转它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773450/

相关文章:

java - 原始包装器内存空间开销与泛型,在 Java 中

c++ - 初始化无符号字符的正确方法*

c - C 的 panel.h 中的面板堆叠顺序

java-me - 如何增加 Java ME 中的堆大小?

java - 长时间运行的 Windows 服务消耗内存

c# - 为什么 Stack<T> 和 Queue<T> 没有 Capacity 属性而 List<T> 有?

c++ - 我的 Visual C++ 程序可以监听它自己的调试输出吗?

c++ - 想逐行阅读,但 fstream 只读第一行

c++ - 当前对象的访问类

node.js - 堆栈跟踪 Nodejs REST API 错误