相关疑难解决方法(0)

初始化非常大的结构的正确方法是什么?

在我们的代码中,我们曾经有类似这样的东西:

   *(controller->bigstruct) = ( struct bigstruct ){ 0 };
Run Code Online (Sandbox Code Playgroud)

这曾经很好用,然后我们升级了GCC版本并突然开始看到堆栈溢出.看看程序集,旧的GCC代码(2.x)基本上是这样做的:

memset(controller->bigstruct, 0, sizeof(struct bigstruct));
Run Code Online (Sandbox Code Playgroud)

新的GCC(3.4.x)正在这样做

   struct bigstruct temp = { 0 };
   controller->bigstruct = temp;
Run Code Online (Sandbox Code Playgroud)

在审查了C99规范后,我明白了为什么; C99基本上要求堆栈上存在匿名结构.这是一个很好的概念,但是这个结构大了4兆字节,而且只能在堆上存在!

我们已经使用了我们自己的'初始化'功能来明确设置成员,但这很难看并且是一个维护问题.我不认为memset是一个合适的解决方案,因为我不知道0的位值是该类型的适当零值(我知道,但是你知道,但是你有;我不介意编译器做到了,因为它可以知道)

初始化像这样的大型结构的"正确"或至少是最好的方法是什么?

为了进一步阐明我认为memset不是解决方案的原因:未明确初始化的成员的初始化规则与静态初始化相同,如下: - 如果它有指针类型,则初始化为空指针; - 如果它有算术类型,则初始化为(正或无符号)零; ...

'memset'会将内存设置为位模式为零,这不一定是一回事.想象一下不使用IEEE浮点数的系统.不寻常,但由C支持.0.0的表示不一定意味着"全位零",它可以是处理器方便的任何东西.

c struct

23
推荐指数
2
解决办法
2万
查看次数

标签 统计

c ×1

struct ×1