C++标准对局部变量的存储和分配有什么保证?

What does the C++ standard guarantee regarding the storage, allocation of local variables?

本文关键字:什么 分配 标准 局部变量 存储 C++      更新时间:2023-10-16

让我们考虑这个简单的C++代码:

struct vector3d { double x, y, z; };
void foo()
{
vector3d v;
...
}

C++对v的位置有什么看法?我的猜测是:没什么,这是有道理的,因为C++不应该为这些潜在的记忆概念而烦恼。

但是,如果C++标准不讨论堆栈,堆和动态内存分配的具体概念,那么在这种情况下,它如何保证编译器不会选择将这一行转换为对malloc的基础调用而不是经典的sub rsp, X

在它不保证任何事情的情况下,C 是否保证某些事情(出于好奇(?是否C++所有开发人员都普遍认为这将在堆栈上?

谢谢!

你是对的,C++标准没有直接说明这一点。事实上,诸如"堆栈"或"堆"之类的概念在标准的 POV 中没有意义。

这实际上是一个实现质量问题,除了假设的 Hell++(其座右铭是"坚持 RAW 并尽可能违反 RAI"(之外,没有编译器有理由将自动持续时间的局部变量存储在堆上。

事实是,本地对象(自动对象(必须以与创建相同的顺序销毁。因此,堆栈的概念是标准期望局部变量的行为方式所固有的。在描述物体破坏时,它还提到了术语"堆栈展开"。

因此,术语"堆栈"作为一般计算术语很好地应用于局部变量C++。如何实现这样的"堆栈"以及它可能在内存中的位置有待争夺,但堆栈基本上是一个"后进先出">的概念。这就是C++标准规定必须进行本地对象创建/销毁的方式。

术语"堆"虽然在标准中没有使用,但是一个通用的计算术语,完全适用于C++标准的"免费商店"所做的事情。这是一个可以获取和返回任意存储块的常规区域。

因此,该标准确实规定C++程序(至少(需要这两种类型的存储。一个行为类似于堆栈(按创建相反的顺序销毁(,另一个行为类似于堆(任意分配/释放(。