当前位置:  开发笔记 > 编程语言 > 正文

在C++中初始化位域结构的最佳方法是什么?

如何解决《在C++中初始化位域结构的最佳方法是什么?》经验,为你挑选了3个好方法。

在C++中,我有一个包含匿名位域结构的类.我想将其初始化为零,而无需手动写出所有字段.

我可以想象将初始化放在三个地方:

    在位域中创建构造函数

    在包含类的构造函数的初始化列表中清零

    在包含类的构造函数的主体中清零

这个位域有很多字段,我宁愿不列出所有字段.

例如,请参阅以下代码:

class Big {
    public:
        Big();

        // Bitfield struct
        struct bflag_struct {
            unsigned int field1 : 1;
            unsigned int field2 : 2;
            unsigned int field3 : 1;
            // ...
            unsigned int field20 : 1;
            // bflag_struct(); <--- Here?
        } bflag;

        unsigned int integer_member;
        Big         *pointer_member;
}

Big::Big()
  : bflag(),             // <--- Can I zero bflag here?
    integer_member(0),
    pointer_member(NULL)
{
    // Or here?
}

其中一个更好吗?或者还有其他我想念的东西?

编辑:根据下面接受的答案(Ferruccio),我决定采用这个解决方案:

class Big {
    // ...

    struct bflag_struct {
        unsigned int field 1 : 1;
        // ...
        bflag_struct() { memset(this, 0, sizeof *this); };
    }

    // ...
}

Ferruccio.. 9

你总是可以在你的构造函数中执行此操作:

memset(&bflag, 0, sizeof bflag);


Ryan Graham.. 9

将bitfield结构与更容易初始化为0的内容联合起来.



1> Ferruccio..:

你总是可以在你的构造函数中执行此操作:

memset(&bflag, 0, sizeof bflag);



2> Ryan Graham..:

将bitfield结构与更容易初始化为0的内容联合起来.



3> Adam Rosenfi..:

您可以使用union,虽然这会在访问字段时添加额外的间接级别:

class Big {
    union {
        struct {
            unsigned int field1 : 1;
            ...
        } fields;
        unsigned int all_fields;
    };
    ...
};

Big::Big()
  : all_fields(0),
    ...
{
    ...
}

MSVC允许联合内部的匿名结构(参见例如D3DMATRIXin 的定义),但这是一个非标准的C++扩展,如果可以,你应该避免使用它.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有