让我们考虑一下这个简单的C ++代码:
struct vector3d { double x, y, z; };
void foo()
{
vector3d v;
...
}
C ++对v
的位置有何看法?我的猜测是:什么都没有,这是有道理的,因为C ++不应该为这些底层的内存概念而烦恼。
但是如果C ++标准没有讨论堆栈,堆和动态内存分配的具体概念,那么在这种情况下它如何保证编译器不会选择使用{{1的基础调用来转换此行而不是经典的malloc
?
如果它不能保证任何东西,C会保证某些东西(出于好奇)吗?是否所有C ++开发人员都普遍认为这将在堆栈中?
谢谢!
答案 0 :(得分:10)
您认为C ++标准没有直接说明这一点。确实,诸如" stack"等概念。或"堆"从标准的POV中没有意义。
这实际上是一个质量执行问题,除了假设的Hell ++(其座右铭是"坚持RAW并尽可能地违反RAI"),没有编译器有理由存储堆上的自动持续时间局部变量。
答案 1 :(得分:3)
事实上,本地对象(自动对象)必须以相反的顺序从其创建中销毁。因此,堆栈的概念是标准期望局部变量的行为所固有的。它还提到术语"堆栈展开"在描述对象破坏时。
术语"堆栈"因为通用计算术语因此适用于C++
局部变量。这样的"堆栈"已经实现了,它可能位于内存中的位置可以用于抓取,但堆栈基本上是一个概念,它是Last In First Out。这就是C ++标准必须发生本地对象创建/销毁的方式。
术语" heap"虽然没有在标准中使用,但是通用计算术语完全适用于C ++标准版#34;免费商店"确实。这是一个可以获取并返回任意存储块的一般区域。
因此,标准规定C ++程序需要(至少)这两种类型的存储。一个行为类似于堆栈(以创建的相反顺序销毁)和一个行为类似堆(任意分配/释放)。