时
int array[100] = {};
比
快int array[100];
for(int i=0; i<100; ++i){
array[i] = 0;
}
或者他们是平等的吗?有什么区别?
答案 0 :(得分:3)
对于两个显示的变体,非静态分配的数组的初始化可能以相同的方式实现。您将不得不测量或查看生成的装配。
对于静态分配的数据(C ++用语中的namespace scope数据),在UNIX上,BSS segment表示零初始化数据,data segment表示非零初始化数据。 BSS段中的符号位置仅在位置和大小中指定,其内容隐式为零,并且在可执行文件中不占用任何大小。我当然会尝试利用大数组的零初始化。 (但是,大部分时间我都在处理大数组,我不知道它们有多大,我必须动态地分配和初始化它们。)
一旦你需要不同于0的初始值,它们的编译时初始化将占用可执行文件中的空间(data segment),并且你将面临经典的空间/时间权衡。
鉴于今天的CPU速度比内存和磁盘带宽要快得多,动态初始化将为您带来很长的路要走,而且更灵活。
答案 1 :(得分:1)
这在很大程度上取决于你的编译器,我的猜测是打开适当的优化,两者都是一样的。它还取决于您之后对值的处理方式。如果array
立即超出范围,则根本不会创建它。如果只读取值,0
可能直接可用,实际读取可能根本不会发生。您最好的选择是根据您的具体用例进行分析。
请注意,这仅适用于0
的初始化,如果您需要其他值,则第一个不是选项。
答案 2 :(得分:1)
此代码:
int array[100] = {};
意味着编译器可以自由地做任何想要初始化数组的事情。这可能意味着将初始化烘焙到编译代码中,使初始化为零或至少是恒定时间。这可能是O(1)表现,但是没有保证。
另一方面,这段代码:
int array[100];
for(int i=0; i<100; ++i){
array[i] = 0;
}
是O(N)。它永远不会小于O(N)因为你有一个for循环。也许在某些情况下,编译器可能会看到它可以优化掉for循环,但它对它来说将是一个更难的问题。
因此,静态初始化可以更快,但不一定。 for循环几乎肯定不会更快。
答案 3 :(得分:1)
int array[100] = {};
这将默认初始化一个数组,这意味着对于基本(标量)类型,整个数组将被正确地零初始化,实际上在O(1)时间内。因为它的编译器实现它必然会被优化。
int array[100];
for(int i=0; i<100; ++i){
array[i] = 0;
}
这里程序员加强并负责初始化数组。现在它取决于编译器优化代码的编写程度,以回答它是否与先前的初始化相同或可能不足。