这是初始化结构体中所有位字段的正确方法吗?

问题描述 投票:0回答:1

我将 bool 打包在一个 C++ 结构中,我想在构造时将它们全部初始化为零。

这是正确/安全的方法吗?

我认为是这样,但我不是100%确定,我希望律师能够权衡...

struct packed_flags {
  // All the flags (there's less than 16 of them)
  bool f1: 1;
  bool f2: 1;
  bool f3: 1;
  bool f4: 1;
  // ...

  // Pad the struct to a 16-bit size
  uint16_t: 0;

  // Constructor to initialize them all to 'false'
  packed_flags() {
    *(uint16_t*)(this) = 0;
  }
} flags;
c++ bit-fields
1个回答
0
投票

*(uint16_t*)(this) = 0;
是一种别名冲突,因此是未定义的行为。
*this
不是
uint16_t
类型,也不存在任何可与
uint16_t
指针相互转换的
*this
类型对象。

强制默认构造函数将所有成员归零的正确方法是根本不编写任何默认构造函数,而是依赖隐式定义的构造函数,并显式指定默认成员初始值设定项:

struct packed_flags {
  // All the flags (there's less than 16 of them)
  bool f1: 1 = 0;
  bool f2: 1 = 0;
  bool f3: 1 = 0;
  bool f4: 1 = 0;
  // ...

  // Pad the struct to a 16-bit size
  uint16_t: 0 = 0;
} flags;

或者,即使没有这些默认初始化程序,您也可以使用

()
{}
进行初始化,以强制零初始化:

struct packed_flags {
  // All the flags (there's less than 16 of them)
  bool f1: 1;
  bool f2: 1;
  bool f3: 1;
  bool f4: 1;
  // ...

  // Pad the struct to a 16-bit size
  uint16_t: 0;
} flags = {};
© www.soinside.com 2019 - 2024. All rights reserved.