Gui*_*e D 2 c arrays performance static-analysis initialization
我正在纠正静态分析 (MISRA-C-2012) 违规行为,其中一项规则(规则 9.3)规定变量应在使用前初始化。
例如:
void bar_read(int * array)
{
printf("array[1]: %u\n",array[1]);
}
void bar_write(int * array)
{
array[1]=1;
}
int main(void)
{
#define FOO_SIZE 12
#ifdef MISRA_VIOLATION_DISABLED
int foo[FOO_SIZE] = {0}; //ok
#else
int foo[FOO_SIZE]; //violation
#endif
bar_read(foo);
bar_write(foo);
bar_read(foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的一些同事声称他们正在删除变量初始化(对于大数组),foo[FOO_SIZE] = {0};
因为它会降低性能,这让我感到困惑。
在我的理解中,零初始化变量是在编译时放在 bss 部分中的,并且没有运行时性能影响。
我会错吗?这可能取决于编译器吗?是否有任何优化使其成为现实?
在函数内部使用int foo[FOO_SIZE]
(nostatic
或extern
)定义的数组具有自动存储持续时间,这意味着每次执行到达它所在的块时它都会“创建”(为其保留内存),并在执行时“销毁”(内存被释放)该块结束。因为函数可以递归调用,所以不能在.bss
节中为自动对象保留内存。堆栈通常用于它们。
此外,即使它们在.bss
段中,它们在 C 模型中的生命周期仍然在每次它们所在的块开始和结束时开始和结束。因此,如果它们被初始化,则每次新的生命周期开始时它们都必须被初始化。将它们存储在该.bss
部分不会在这方面保存任何内容。
此外,如果该.bss
部分是零初始化的,则它不是免费的。每当操作系统提供内存来支持零初始化部分时,它必须清除该内存。