通过结构指针将结构的成员初始化为零
Initialize members of a struct to zero via the struct pointer
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);
}
相关文章:
- 多成员Constexpr结构初始化
- 为什么用结构初始化数组需要指定结构名称
- 使用指定的初始值设定项聚合匿名结构初始化
- 不同的类或结构初始化方法之间的性能差异是什么?
- 如何在结构初始化中获取成员C++
- C++正确的结构初始化
- 使用大括号进行结构初始化
- 内部结构初始化不起作用 - C++
- 使用嵌套结构初始化并集
- 使用匿名结构初始化联合
- 结构初始化语法
- 结构初始化的 C++ 向量
- C++嵌套结构初始化和访问成员
- 结构初始化中的常量正确性
- 使用 C++ 中的自定义元素进行 Const 结构初始化
- 如何在结构C++初始化内置数组
- Visual C++ 模板类成员结构初始化语法糖
- C++结构初始化
- C 在结构初始化过程中带有内部阵列的奇怪错误
- 此C/C 的结构初始化器如何使用足够的字段工作