【发布时间】:2014-09-11 20:53:35
【问题描述】:
所以对于这样的代码:
class foo{
void bar(){
static int var = 2;
}
};
我知道对于foo 类型的所有对象只会有var 的实例,但是C++ 是否甚至在创建foo 之前为变量var 分配内存?我问这个是因为即使在 foo 被销毁之后,var 仍将存在于整个程序中。
【问题讨论】:
所以对于这样的代码:
class foo{
void bar(){
static int var = 2;
}
};
我知道对于foo 类型的所有对象只会有var 的实例,但是C++ 是否甚至在创建foo 之前为变量var 分配内存?我问这个是因为即使在 foo 被销毁之后,var 仍将存在于整个程序中。
【问题讨论】:
C++ 是否在创建 foo 之前就为变量
var分配内存?
是的,确实如此,因为var 的值最终将占用的内存是预先保留的。当2 的常量值写入var 的内存时,是实现定义的。该标准唯一保证的是,它会在您致电foo::bar() 之前的某个时间发生。
如果您使用具有副作用的表达式(例如,通过调用函数)初始化静态变量,则该调用将在您第一次执行该函数时执行。
foo 被销毁后,var 将存在于整个程序中。
var 将独立于您的程序可能创建的任何foo 实例而存在。当您随时调用foo::bar() 时,您将获得程序分配给它的最后一个var 值。
【讨论】:
foo::bar()之前?如果初始值有副作用怎么办? (在 C++ 中允许,在 C 中不允许)这些副作用是否会在不可预测的时间发生?
malloc之类的。
var 将在第一次调用 foo:bar() 时构造。当程序终止时,它将被破坏。
注意foo 是一个类,而不是一个对象实例,因此foo 永远不会被“销毁”
更新:标准规定变量的存储空间是在程序开始时分配的。 en.cppreference.com/w/cpp/language/storage_duration – (感谢 broncoAbierto 纠正我)。
【讨论】:
foo 永远不会被“销毁”,但它的静态成员是作为程序反初始化的一部分。对于int,这当然是无操作的。