【问题标题】:Difference between array[n] and array[]?数组 [n] 和数组 [] 之间的区别?
【发布时间】:2011-08-31 22:56:10
【问题描述】:

有什么区别吗,比如

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

和,

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

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

【问题讨论】:

  • “1234332534 个元素的数组”——在堆栈上分配大约 4GB(12 亿整数)可能很麻烦。通常的堆栈大小约为几兆字节。除此之外,没有理由使用一种方法而不是另一种方法,因为如果有任何开销,它只会在编译时发生。
  • 相对于编译的其余部分而言,“计算”元素所花费的时间并不明显——事实上,即使是第二种形式,它也必须计算在内,我认为(报告错误),无论如何它都会处理相同数量的元素。 int arr[2] = {1, 2, 3}; -- 错误?

标签: c++ c arrays


【解决方案1】:

这个数组声明:

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

完全一样:

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

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

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

【讨论】:

    【解决方案2】:

    没有区别,只要[] 之间的显式元素计数与{} 之间的初始化器数量相同。

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

    【讨论】:

    • 初始化元素的数量可以小于[]中的数量。如果有更多,那就是错误。
    • @wallyk:嗯,我从来没有说过数字必须是一样的。我说:没有区别如果数量相同。如果[] 中的数字大于将有差异,因为它将强制创建额外的默认初始化(或在 C 中初始化为零)元素。
    【解决方案3】:
    1. 最终结果没有区别;不过,第一种形式更容易编写和维护,因为您不必手动计算元素。
    2. 编译器可能无论如何都必须对元素进行计数:它必须检测它们是否更多,因为这是编译错误,如果它们更少,则必须将其他元素初始化为零。
    3. 无论如何,此类计数是在编译时完成的,因此不会影响生成的可执行文件的性能。
    4. 一般来说,您永远不会在堆栈上或作为全局变量创建非常大的数组(因为通常大的堆栈分配会失败,而作为全局变量的大数组会产生大量的可执行文件)。
    5. 即使您设法让编译器接受包含 1234332534 个元素的静态/本地数组,元素的计数也可能是此编译的最后一个性能问题。

    †。另一方面,大全局阵列是二进制资源通常包含在固件中以闪存到嵌入式设备上的方式。但我认为没有人会考虑对大于几 MB 的东西使用这种蛮力方法。

    【讨论】:

      【解决方案4】:

      没有区别,只是程序员不必确定数组中有多少元素。编译器仍然会计算元素以分配适当的数量,因此两者都花费编译器相同的时间来编译。

      【讨论】:

        【解决方案5】:

        在第二种情况下,如果为初始化内存提供了错误数量的值,预编译器将捕获错误。差不多就是这样。

        【讨论】:

        • 不正确。 []s 中的数字可能大于初始化列表的大小;在这种情况下,假设剩余区域被初始化为零。
        • 允许提供小于数组大小的元素,其他元素为零初始化。并且这里不涉及预编译器,检查由实际编译器完成。
        猜你喜欢
        • 2013-07-20
        • 2011-12-01
        • 2013-08-11
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多