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

时间:2018-05-21 11:05:08

标签: c++ memory standards

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

struct vector3d { double x, y, z; };

void foo()
{
    vector3d v;
    ...
}

C ++对v的位置有何看法?我的猜测是:什么都没有,这是有道理的,因为C ++不应该为这些底层的内存概念而烦恼。

但是如果C ++标准没有讨论堆栈,堆和动态内存分配的具体概念,那么在这种情况下它如何保证编译器不会选择使用{{1的基础调用来转换此行而不是经典的malloc

如果它不能保证任何东西,C会保证某些东西(出于好奇)吗?是否所有C ++开发人员都普遍认为这将在堆栈中?

谢谢!

2 个答案:

答案 0 :(得分:10)

您认为C ++标准没有直接说明这一点。确实,诸如" stack"等概念。或"堆"从标准的POV中没有意义。

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

答案 1 :(得分:3)

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

术语"堆栈"因为通用计算术语因此适用于C++局部变量。这样的"堆栈"已经实现了,它可能位于内存中的位置可以用于抓取,但堆栈基本上是一个概念,它是Last In First Out。这就是C ++标准必须发生本地对象创建/销毁的方式。

术语" heap"虽然没有在标准中使用,但是通用计算术语完全适用于C ++标准版#34;免费商店"确实。这是一个可以获取并返回任意存储块的一般区域。

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