如何清空 - 初始化`const`成员

时间:2017-09-29 21:41:49

标签: c++ oop constructor initialization const

我的情况是我有const成员变量,但在某些控制路径中,我可以保证不会访问它。在这些情况下,当我构造对象时,我不想浪费时间初始化该成员。

考虑以下玩具示例:

struct Foo {
    int val;
    Foo() {}
};
auto function() { return Foo(); }

这会生成所需的程序集(Clang 5.0.0 -O3):

function():                           # @function()
        ret

但是,如果我按照我的意愿将int val;更改为int const val;,则编译失败(因为必须初始化const成员):

struct Foo {
    int const val;
    Foo() {} //<- Fails!  `const` members must be initialized.
};

如何初始化int const val;,但不会增加任何运行时成本?例如,我应该如何修复上面例子中的标记线?

注意:默认初始化val(即使用Foo() : val() {}Foo() = default;不可接受,因为此初始化val

function():                           # @function()
        xor     eax, eax
        ret

2 个答案:

答案 0 :(得分:0)

你首先应该问这是否可能,如果是的话。

在这种情况下,答案是 no ,因为类的const数据成员必须由您或默认的初始化值初始化。

PS:这必须是过早优化的经典案例,因为初始化变量在时间上相对便宜。

答案 1 :(得分:0)

如果它只是一个int,你就无法真正节省时间。 如果它更复杂,请使用std::optional<T>。初始化它非常便宜(如果空的话,单个位设置为0),您可以查询它是否已初始化,它只是内存中的一点开销,并且在运行时为零(如果已知为非空则取消引用没有if在明智的优化实施中。)

extern bool ShouldInit;

struct Foo {
    std::optional<MyExpensiveType> oMyStuff_;
    Foo()
        : oMyStuff(ShouldInit ? make_optional<MyExpensiveType>()
                              : std::nullopt) {}
    int fn()
    {
        return oMyStuff_ ? *oMyStuff_
                           : 0;
    }
};