在C中,有没有一种方法可以使子对象的结构初始化不初始化为零



假设我有一个结构,里面有一个数组:

struct my_struct {
// 128 will be enough for all of my use cases,
// saves me from using malloc.
double values[128]; 
int value_count; 
const char *info;
};

C规范介绍了复合初始化程序:

6.5.5.14 102(例如,没有显式初始化器的子对象被初始化为零。

这意味着如果我对结构进行零初始化,它的128个双精度将全部初始化为零。如果我只显式初始化3个第一个双打,那么剩下的125个双打将被初始化为零。

struct my_struct s = {
// 3 values explicitly initialized,
// the rest will be initialized to zero.
.values = { 1.0, 2.0, 3.0 },
.value_count = 3,
.info = "sequence of reals",
};

我喜欢指定初始化器的优雅,但我不喜欢我可能会浪费太多时间来清理我不会使用的内存。如果我只关心前3个双打,有没有办法让C不为零初始化剩下的125个双打?如果我不想在内存清理上浪费周期,我应该避免指定的初始化程序吗?

C标准没有提供任何功能来初始化聚合的某些部分,而不是定义中的其他部分。要给某些部分而不是其他部分赋值,只需单独分配值:

struct my_struct s;
s.values[0] = 1.0;
s.values[1] = 2.0;
s.values[2] = 3.0;
s.value_count = 3;
s.info = "sequence of reals";

它只是源代码;在定义中设置初始值和在赋值中设置它们之间没有什么神奇之处——如果有某种方法可以在不清除结构的所有其他部分的情况下设置定义中的一些初始值,那么它将具有与上述源代码相同的效果。

如果编译器看不到后续代码没有使用125个未使用的元素,那么可以预期会花费一些周期来清除这些元素。

最新更新