C ++:将类对象初始化为0的最快方法

时间:2016-05-25 04:27:40

标签: c++ optimization initialization

让我说我有一个对象我想在构造函数中初始化为0。 instanced对象占用的每一位都应该为0,包括所有非POD成员,完全忽略其个人默认构造函数。

这在C ++中是否可行?如果是这样,有没有办法可以做到这一点至少与通过初始化列表(如果允许)将每个成员初始化为0一样快?

(有明显的陷阱,但我很好奇;请假设我有一个不可靠的理由!)

1 个答案:

答案 0 :(得分:1)

没有"魔法"语法来实现这一点。

如果类没有虚拟表,则可以使用memset(this, 0, sizeof(* this)),但不建议使用。

您可以尝试使用offsetof来查明第一个成员的地址,然后从那里删除。这比仅仅memset整个事情要好一点,但它仍然让我感到不舒服:

// Example non-POD type.
class B
{
public:
    B() : b(0xDEADBEEF) {}
    int b;
};

class Monstrosity
{
public:
    Monstrosity()
    {
        size_t offset = offsetof(Monstrosity, a);
        uint8_t *eraseStart = (uint8_t *)this + offset;
        memset(eraseStart, 0, sizeof(Monstrosity) - offset);
    }

    virtual int foo() { return 0; }

    int a;
    B b;
};

如果您的会员有虚拟桌子,如果有的话,您实际上已经搞砸了。