【问题标题】:C++ static variable in member function [duplicate]成员函数中的C ++静态变量[重复]
【发布时间】:2014-09-11 20:53:35
【问题描述】:

所以对于这样的代码:

class foo{
  void bar(){
     static int var = 2;
  }
};

我知道对于foo 类型的所有对象只会有var 的实例,但是C++ 是否甚至在创建foo 之前为变量var 分配内存?我问这个是因为即使在 foo 被销毁之后,var 仍将存在于整个程序中。

【问题讨论】:

    标签: c++ object static


    【解决方案1】:

    C++ 是否在创建 foo 之前就为变量 var 分配内存?

    是的,确实如此,因为var 的值最终将占用的内存是预先保留的。当2 的常量值写入var 的内存时,是实现定义的。该标准唯一保证的是,它会在您致电foo::bar() 之前的某个时间发生。

    如果您使用具有副作用的表达式(例如,通过调用函数)初始化静态变量,则该调用将在您第一次执行该函数时执行。

    foo 被销毁后,var 将存在于整个程序中。

    var 将独立于您的程序可能创建的任何foo 实例而存在。当您随时调用foo::bar() 时,您将获得程序分配给它的最后一个var 值。

    【讨论】:

    • 第一次调用foo::bar()之前?如果初始值有副作用怎么办? (在 C++ 中允许,在 C 中不允许)这些副作用是否会在不可预测的时间发生?
    • 内存分配未初始化。 初始化(先前分配的内存区域)将在第一次调用该函数时发生。需要注意的是,内存会在程序启动时静态分配,而不是使用malloc之类的。
    • @BenVoigt 啊,这些讨厌的副作用!谢谢!
    【解决方案2】:

    var 将在第一次调用 foo:bar() 时构造。当程序终止时,它将被破坏。

    注意foo 是一个类,而不是一个对象实例,因此foo 永远不会被“销毁”

    更新:标准规定变量的存储空间是在程序开始时分配的。 en.cppreference.com/w/cpp/language/storage_duration – (感谢 broncoAbierto 纠正我)。

    【讨论】:

    • foo 永远不会被“销毁”,但它的静态成员作为程序反初始化的一部分。对于int,这当然是无操作的。
    • @5gon12eder:是的,但是 OP 将 foo 的破坏称为关机前发生的事情。
    • 标准规定,变量的存储空间是在程序开始时分配的。 en.cppreference.com/w/cpp/language/storage_duration
    • @broncoAbierto:这就是我对冲它的原因。谢谢。我会更新的。
    • @broncoAbierto:那个网站说的。但是标准是怎么说的呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多