C++ 标准对局部变量的存储、分配有什么保证?
What does the C++ standard guarantee regarding the storage, allocation of local variables?
让我们考虑一下这个简单的 C++ 代码:
struct vector3d { double x, y, z; };
void foo()
{
vector3d v;
...
}
C++ 对 v
的位置有何说法?我的猜测是:什么都没有,这是有道理的,因为 C++ 不应该为这些底层内存概念而烦恼。
但是,如果 C++ 标准不讨论堆栈、堆以及动态内存分配的具体概念,它如何保证在这种情况下编译器不会选择通过对 malloc
而不是经典 sub rsp, X
?
如果它不保证任何东西,C 是否保证某些东西(出于好奇)?所有 C++ 开发人员都普遍认为这将在堆栈上吗?
谢谢!
你是对的,C++ 标准没有直接说明这一点。事实上,"stack" 或 "heap" 等概念在标准的 POV 中没有意义。
这实际上是一个实现质量问题,除了假设的 Hell++(其座右铭是 "stick to RAW and violate RAI as much as possible")之外,没有编译器有理由在堆上存储自动持续时间的局部变量。
事实是,本地对象(自动对象)必须按创建顺序相反的顺序销毁。因此,堆栈的 概念 是标准期望局部变量行为方式所固有的。它还在描述对象销毁时提到了术语"stack unwinding"。
术语"stack"作为通用计算术语因此很好地应用于C++
局部变量。这样的 "stack" 是如何实现的,它在内存中的位置有待商榷,但堆栈基本上是一个 概念,即后进先出。这就是 C++ 标准所说的本地对象 creation/destruction 必须出现的方式。
术语 "heap" 虽然未在标准中使用,但它是一个 通用计算术语 ,它完全适用于 C++ 标准的 "free store" 所做的事情。这是一个可以获取和返回任意存储块的通用区域。
所以标准确实规定 C++ 程序需要(至少)这两种类型的存储。一种表现得像堆栈(按创建的相反顺序销毁),一种表现得像堆(任意allocation/deallocation)。
让我们考虑一下这个简单的 C++ 代码:
struct vector3d { double x, y, z; };
void foo()
{
vector3d v;
...
}
C++ 对 v
的位置有何说法?我的猜测是:什么都没有,这是有道理的,因为 C++ 不应该为这些底层内存概念而烦恼。
但是,如果 C++ 标准不讨论堆栈、堆以及动态内存分配的具体概念,它如何保证在这种情况下编译器不会选择通过对 malloc
而不是经典 sub rsp, X
?
如果它不保证任何东西,C 是否保证某些东西(出于好奇)?所有 C++ 开发人员都普遍认为这将在堆栈上吗?
谢谢!
你是对的,C++ 标准没有直接说明这一点。事实上,"stack" 或 "heap" 等概念在标准的 POV 中没有意义。
这实际上是一个实现质量问题,除了假设的 Hell++(其座右铭是 "stick to RAW and violate RAI as much as possible")之外,没有编译器有理由在堆上存储自动持续时间的局部变量。
事实是,本地对象(自动对象)必须按创建顺序相反的顺序销毁。因此,堆栈的 概念 是标准期望局部变量行为方式所固有的。它还在描述对象销毁时提到了术语"stack unwinding"。
术语"stack"作为通用计算术语因此很好地应用于C++
局部变量。这样的 "stack" 是如何实现的,它在内存中的位置有待商榷,但堆栈基本上是一个 概念,即后进先出。这就是 C++ 标准所说的本地对象 creation/destruction 必须出现的方式。
术语 "heap" 虽然未在标准中使用,但它是一个 通用计算术语 ,它完全适用于 C++ 标准的 "free store" 所做的事情。这是一个可以获取和返回任意存储块的通用区域。
所以标准确实规定 C++ 程序需要(至少)这两种类型的存储。一种表现得像堆栈(按创建的相反顺序销毁),一种表现得像堆(任意allocation/deallocation)。