通过结构指针将结构的成员初始化为零

Initialize members of a struct to zero via the struct pointer

本文关键字:结构 初始化 成员 指针      更新时间:2023-10-16
typedef struct {  
double firstArray[3];
double secondArray[4][4];
bool   thirdArray[2];    
} myStruct;

我知道我们可以使用 int myArray[10] = { 0 }; 在一行中将数组的所有值初始化为零

我有一个函数将 myStruct 中数组的所有元素初始化为零和 false(对于布尔值)。

void initializeElementsOfStruct(myStruct* str)
{
str->firstArray[0] = 0.0;
str->firstArray[1] = 0.0;
str->firstArray[2] = 0.0;
...
}

代替上述或使用 for 循环,我如何在一个衬里中做到这一点?

编辑:该结构也可能包含非原始数据类型。

由于结构仅由基元类型组成,因此可以将其整个内存表示形式设置为零,并且应该会获得所需的效果。(这可能会覆盖您在成员方法中不会写入的填充字节,但最终可能会更有效

在 C 语言中:

#include <string.h>
memset(str, 0, sizeof *str)

在C++:

#include <algorithm>
std::fill(reinterpret_cast<char*>(str),
          reinterpret_cast<Char*>(str) + sizeof *str, 0);

C89/90 向后兼容的惯用解决方案是

void initializeElementsOfStruct(myStruct* str)
{
  const myStruct ZERO = { 0 };
  *str = ZERO;
}

对于"愚蠢"的编译器,将ZERO声明为 static(在性能关键型代码中)可能是有意义的。

在 C99 中,您可以简单地做

void initializeElementsOfStruct(myStruct* str)
{
  *str = (myStruct) { 0 };
}

一个相当等效C++版本(知道C++特定的初始化语义)将如下所示

void initializeElementsOfStruct(myStruct* str)
{
  *str = myStruct();
}

在 C++11 中,您可以定义如下的帮助程序函数:

#include <cstring>
#include <type_traits>
template<typename T,
         typename = typename std::enable_if<std::is_pod<T>::value, T>::type>
void zero_initialize(T &x) {
  std::memset(&x, 0, sizeof(x));
}

它仅适用于 POD 类型,否则无法编译。

void initializeElementsOfStruct(myStruct* str) {
  zero_initialize(*str);
}