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运算符时&)。这仅仅是为了“使事情正常”吗?
如果我错了,请纠正我,但我想这是C创作者的设计决定
它不是C语言或C ++设计的一部分。实际上,这些标准不存在诸如“堆”或“堆栈”内存之类的东西。
这是一个实现细节。每种语言的每种实现方式可能会有所不同。
指向不相关对象(例如&i < &j或(void*)pin > (void*)pi具有未指定结果)的指针之间的有序比较。任何一个都不能保证小于或大于另一个。
对于它的价值,您的示例程序在我的系统上输出三个“ false”计数。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |