array[n]和array[]有什么区别?

6

Is there any difference between, for example

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

而且,

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

编译器需要自己计算第一种情况的元素数量,这可能需要一些时间(1234332534个元素的{...}),所以第二种情况比第一种更有效?

"1234332534个元素的数组" -- 在堆栈上分配大约4GB(12亿个整数)可能会有问题。通常堆栈大小为几兆字节。除此之外,没有理由使用一种方法而不是另一种方法,因为如果有任何开销,它只会在编译时发生。 - Damon
4
“计算”元素所需的时间与编译的其余部分相比将是微不足道的,事实上,即使在第二种形式中,它也必须进行计数(以报告错误),而且无论如何它都将处理相同数量的元素。“int arr [2] = {1、2、3};— 嗯? - user166390
5个回答

8

这个数组声明:

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

与此完全相同:

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

元素的数量在编译时计算,因此不会有与此相关的运行时成本。

第一种声明的优点是不需要程序员手动计算元素的数量,因此从这个意义上说,它是更有效率的数组声明。


5
只要[]中的显式元素数量与{}之间的初始化器数量相同,就没有区别。
关于“效率”的问题是无意义的。数组大小在编译时确定,这意味着它对代码的效率没有影响。而且,由于无论如何编译器都必须解析初始化器列表,因此它对编译效率没有实际影响。

2
初始化元素的数量可以少于[]中的数字。如果超过了,则会出现错误。 - wallyk
@wallyk:好吧,我从未说过数字必须相同。我说过:如果数字相同,则没有区别。如果[]中的数字大于,则会有区别,因为它将强制创建额外的默认初始化(或在C中初始化为零)元素。 - AnT stands with Russia

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

†. 另一方面,大型全局数组通常是固件中二进制资源的包含方式,以便将其闪存到嵌入式设备上。但我认为,任何超过几MB的东西都不应该考虑这种简单粗暴的方法。


1
没有区别,除了你作为程序员不需要确定数组中有多少个元素。编译器仍然会计算元素的数量来分配适当的空间,所以编译这两种方式都需要相同的时间。

0
在第二种情况下,如果提供了错误数量的值来初始化内存,则预编译器将捕获错误。这就是全部。

2
不是真的。方括号[]中的数字可能大于初始化列表的大小;在这种情况下,剩余的区域被假定为初始化为零。 - Billy ONeal
可以提供比数组大小少的元素,其他元素将被初始化为零。这里不涉及预编译器,检查由实际编译器完成。 - Matteo Italia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接