静态对象的非静态成员在哪里分配?

Pie*_*rre 8 c++ object

我有这个代码,我想知道内存分配.

 void f(){
        static A a;
        //Other things...
    }

    class A {
        public:
           A();
        private:
            AnotherObjectType anotherObject;
    };
Run Code Online (Sandbox Code Playgroud)

将在哪里anotherObject分配?在static代码段或其他地方?是否存在anotherObject被覆盖的风险?(f将被召唤几次).

Eri*_*pää 5

所有非堆对象都将位于静态段中,位于f()的静态A实例中.

关于覆盖,如果你在多线程代码中使用了各种单例惯用语,这可能发生在旧的C/C++中.但是,例如,较新的gcc版本使用新标准要求进行静态对象的自动线程安全初始化.请参阅例如C++ 11中的本地静态变量初始化线程安全吗?

  • 更准确地说,非*堆*实际上意味着非*动态*.如果使用自定义分配器,则动态分配的对象也可以位于静态段中."堆"是一个恰好最常用的实现细节. (2认同)