让编译器初始化数组或手动遍历数组以进行初始化是否更快?

dea*_*sin 5 c++ arrays initialization

int array[100] = {};
Run Code Online (Sandbox Code Playgroud)

比...快

int array[100];
for(int i=0; i<100; ++i){
    array[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)

还是相等?有什么区别?

Pet*_* G. 3

对于所示的两种变体,非静态分配数组的初始化很可能以相同的方式实现。您必须测量或查看生成的装配体。

对于静态分配的数据( C++ 中的命名空间范围数据),在 UNIX 上,存在用于零初始化数据的BSS 段和用于非零初始化数据的数据段。BSS 段中的符号位置仅指定位置和大小,它们的内容隐式为零并且在可执行文件中不占用任何大小。我当然会尝试利用大数组的零初始化。(但是,大多数时候我处理大数组,我不知道它们必须有多大,而且无论如何我都必须动态分配和初始化它们。)

一旦您需要不为零的初始值,它们的编译时初始化将占用可执行文件(数据段)中的空间,并且您将面临经典的空间/时间权衡。

鉴于当今的 CPU 速度比内存和磁盘带宽快得多,动态初始化将让您走得更远,也更灵活。