将初始化顺序与存储顺序分离的方法

时间:2017-04-11 08:36:34

标签: c++ initialization memory-layout

假设我希望能够为类Foo的对象进行内存布局优化:

class Foo
    {
    T1 m_x;
    T2 m_y;
    };

现在,T1:s必须始终具有对T2:s的有效引用,因此迫使我首先初始化T2。但这是不可能的,因为m_x是第一位的。我可以为T1创建一个默认构造函数,但是可以让m_x处于僵尸状态。还有其他选择吗?

在这种情况下,T1表示T2的视图。也就是说,之后可以更改T2,但我希望T2始终引用有效对象:

class T1
    {
    public:
        explicit T1(const T2& obj):r_obj(&obj){}
        explicit T1(T2&& obj)=delete; //Don't ever pass a temporary object here...
        void set(const T2& obj) noexcept //Replace the view
            {r_obj=&obj;}

        void set(T2&& obj)=delete; //Again, temporaries are forbidden
        void doStuffThatRequiresObjToBeNonNull();

    private:
        const T2* r_obj;
    };

0 个答案:

没有答案