2011-08-31 90 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

允許提供比數組大小更少的元素,其他元素都是零初始化的。而預編譯器不涉及這裏,檢查是由實際的編譯器完成的。 –

相關問題