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++标准没有直接说明这一点。事实上,诸如"堆栈"或"堆"之类的概念在标准的 POV 中没有意义。
这实际上是一个实现质量问题,除了假设的 Hell++(其座右铭是"坚持 RAW 并尽可能违反 RAI"(之外,没有编译器有理由将自动持续时间的局部变量存储在堆上。
事实是,本地对象(自动对象(必须以与创建相同的顺序销毁。因此,堆栈的概念是标准期望局部变量的行为方式所固有的。在描述物体破坏时,它还提到了术语"堆栈展开"。
因此,术语"堆栈"作为一般计算术语很好地应用于局部变量C++
。如何实现这样的"堆栈"以及它可能在内存中的位置有待争夺,但堆栈基本上是一个"后进先出">的概念。这就是C++标准规定必须进行本地对象创建/销毁的方式。
术语"堆"虽然在标准中没有使用,但是一个通用的计算术语,完全适用于C++标准的"免费商店"所做的事情。这是一个可以获取和返回任意存储块的常规区域。
因此,该标准确实规定C++程序(至少(需要这两种类型的存储。一个行为类似于堆栈(按创建相反的顺序销毁(,另一个行为类似于堆(任意分配/释放(。
相关文章:
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- unique_ptr:在分配之前调用 reset 有什么效果
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 为对象分配整数.输出将是什么?
- 重新分配向量时,向量中的内存会发生什么情况
- C++程序什么都不做,但瓦尔格林德显示内存分配
- C++指针中的这两种类型的值分配有什么区别?
- 删除类成员的动态分配内存的最佳方法是什么
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 虚函数如何工作,分配后新的返回类型会发生什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 如果链表被重新分配,会发生什么
- 堆指针不会被分配给数组有什么原因吗
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 右值需要分配什么向后兼容性
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- 按引用传递和动态内存分配之间的区别是什么
- 如何知道是什么分配了给定的内存块