使用memset归零派生结构

Ale*_*x O 1 c++ constructor sizeof memset

我想将派生结构的所有成员归零.

每隔一段时间就有数百个成员和更多成员被添加,所以我觉得明确地初始化它们容易出错.

结构没有虚函数,所有成员字段都是内置的.然而,由于具有非平凡的构造函数,它们不是POD.

除了练习的标准皱眉外,您是否看到以下任何问题?

struct Base
{
    // Stuff
};

struct Derived : public Base
{
    // Hundreds of fields of different built-in types
    // including arrays

    Derived()
    {
        ::memset(reinterpret_cast<char*>this + sizeof (Base), 0, sizeof *this - sizeof (Base));
    }
};
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jam*_*lis 9

这假设Base基类子对象位于开头Derived.如果添加另一个基类,这将不起作用.

此外,您的代码是错误的:指针算术是根据对象执行的,而不是以字节的形式执行.您需要使用reinterpret_cast<char*>(this)以字节为单位执行算术.无论如何,你仍然不应该这样做.

考虑以下非丑陋的,符合标准的方法,利用值初始化:

struct Derived : public Base
{
    struct DerivedMembers { /* ... */ }

    DerivedMembers data;

    Derived() : data() { }
};
Run Code Online (Sandbox Code Playgroud)

只要DerivedMembers没有构造函数,这将初始化每个数据成员的值data,这看起来就像你想要的行为.

或者,如果您希望在不使用" data"成员变量的情况下访问成员,请考虑使用另一个基类:

struct DerivedMembers { /* ... */ }

struct Derived : Base, DerivedMembers
{
    Derived() : DerivedMembers() { }
};
Run Code Online (Sandbox Code Playgroud)