【发布时间】:2018-05-21 11:05:08
【问题描述】:
让我们考虑一下这个简单的 C++ 代码:
struct vector3d { double x, y, z; };
void foo()
{
vector3d v;
...
}
C++ 对v 的位置有何看法?我的猜测是:什么都没有,这是有道理的,因为 C++ 不应该为这样的底层内存概念而烦恼。
但是如果 C++ 标准没有讨论堆栈、堆以及动态内存分配的具体概念,它如何保证在这种情况下编译器不会选择通过对malloc 的底层调用来翻译这一行而不是经典的sub rsp, X?
如果它不保证任何东西,C 是否保证某些东西(出于好奇)?是不是所有 C++ 开发人员都普遍认为这将在堆栈上?
谢谢!
【问题讨论】:
-
C++ 中的变量存储在堆栈中...如果您想留在堆上,可以使用
new运算符或unique_ptr或shared_ptr... 但最终它们使用@ 987654328@ -
“它如何保证在这种情况下编译器不会选择通过底层调用 malloc 而不是经典的 sub rsp, X 来翻译这一行” - 它没有。这正是我们可能会在 C++20 中看到协程的原因。
-
@elvis.dukaj "C++ 中的变量存储在堆栈中" 如问题所述 - C++ 标准甚至没有提到
stack或heap。因此,没有什么可以禁止人们编写一个不在堆栈上存储变量并且仍然符合标准的编译器。 -
如果
foo()从未被递归调用(或多线程),则可以在固定地址分配局部变量。 -
@AntiClimacus - 当协程将控制权交给调用代码时,必须保留协程的状态(其范围内所有局部变量的值)。调用代码可能会在它之后调用一个常规函数,而一旦我们扩大规模,它就不能很好地与堆栈配合使用。所以更简单的实现是在空闲存储或堆上分配状态。由于该标准不强制“调用堆栈”,因此不需要调整其范围规则以支持协程(当然它仍然需要在其他地方进行调整)。