2011-08-31 117 views
6

是否有任何区别,例如array [n]和array []之间的区别?

int array[]={1, 2, 3, 4, 5}; 

和,

int array[5]={1, 2, 3, 4, 5}; 

编译器需要由自对第一种情况下,计算元件的数量,并且,可以采取一个一定的时间(的{...} 1234332534元素),所以第二种情况比第一种情况更有效率?

+0

“1234332534元素数组” - 在堆栈上分配大约4GB(12亿整数)可能会很麻烦。通常的堆栈大小只有几兆字节。除此之外,没有理由使用另一种方法,因为如果有任何开销,它只会在编译时发生。 – Damon

+4

“计数”元素所花费的时间与编译的其他部分相比并不明显 - 事实上,即使在第二种形式中,我也认为(要报告错误),并且在任何情况下它会处理相同数量的元素。 'int arr [2] = {1,2,3};' - errm? – 2011-08-31 23:03:04

回答

5

只要[]之间的显式元素数与{}之间的初始值设定项数相同,没有区别。

关于“效率”的问题是没有实际意义的。数组大小在编译时确定,这意味着它不会影响代码的效率。而且,无论如何,编译器无论如何都必须解析初始化列表,这对编译效率没有实际影响。

+2

初始化元素的数量可能小于'[]'中的数量。如果还有更多,这是一个错误。 – wallyk

+0

@wallyk:好吧,我从来没有说过号码*有*是一样的。我说:*没有区别*如果数字相同。如果'[]'中的数字大于则会有差异,因为它会强制创建额外的默认初始化(或在C中初始化为零)元素。 # – AnT

8

此数组的声明:

int array[] = {1, 2, 3, 4, 5}; 

是完全相同为:

int array[5] = {1, 2, 3, 4, 5}; 

元件的数量是在编译时计算出,所以有与该相关联的没有运行时成本。

第一声明的优点是,它不需要程序员手动计数元件的数量,所以它的在这个意义上更有效的数组声明。

1

没有区别,除了你,程序员,没有以确定有多少元素在数组中。编译器仍然会计算元素以分配适当的数量,所以两者都需要编译器有相同的时间来编译。

2
  1. 有在最终结果没有差异;仍然,第一种形式更容易编写和维护,因为您不必手动计算元素。
  2. 编译器可能必须对元素进行计数:它必须检测它们是否更多,因为它是一个编译错误,如果它们较少,则其他元素必须初始化为零。
  3. 无论如何,这样的计数是在编译时完成的,所以对生成的可执行文件的性能没有影响。
  4. 一般来说,你从来没有在堆栈上创建非常大的数组或者作为全局变量(因为一般来说大的堆栈分配失败,而大数组作为全局变量会导致巨大的可执行文件)。
  5. 即使您设法让编译器接受1234332534元素的静态/本地数组,元素的计数可能是此编译的最后一个性能问题。

†。另一方面,全球大阵列是如何将二进制资源包含在固件中以便闪存到嵌入式设备上的。但我不认为任何人都会考虑这种蛮力方法来处理大于几MB的任何事情。

+0

+1。 :)(15个字符) –

0

在第二种情况下,如果初始化内存的值数量错误,预编译器将捕获错误。这是非常多的。

+2

不正确。 '[]'中的数字可能大于初始化列表的大小;在这种情况下,假定剩余区域被初始化为零。 –

+0

允许提供比数组大小更少的元素,其他元素都是零初始化的。而预编译器不涉及这里,检查是由实际的编译器完成的。 –

相关问题