2014-02-11 30 views
3

我對編程比較陌生,所以當有人建議構建一個結構數組(每個包含一個特定「item」的n個屬性)比創建n個屬性數組更快時,我發現我的知識不夠關於數組來爭論某種方式或另一種方式。C程序如何從內部數組中獲取信息?

我這樣說的:

how do arrays work internally in c/c++

Basic Arrays Tutorial

但我還是不真正瞭解一個C程序如何檢索從指數的數組中的特定值。

看起來很清楚,數組的數據元素在內存中相鄰存儲,並且數組名稱指向第一個元素。

C程序是否足夠聰明,可以根據數據類型和索引來計算出目標數據的確切內存地址,或者程序是否必須以某種方式迭代每一箇中間數據片段才能到達那裏(如在鏈表數據結構中)?

更重要的是,如果一個程序通過內存地址來請求一條信息,機器如何找到它?

+0

編譯器是由人寫的,人們足夠聰明,可以處理數組運算 –

+0

很多使內存訪問高效或低效的原因與緩存友好性有關:http://stackoverflow.com/questions/16699247/what -is-cache-friendly-code – happydave

回答

5

讓我們舉一個簡單的例子。比方說,你有其在地址1000中存儲這樣的陣列int test[10]

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

的編譯器知道例如,一個int是4個字節。數組訪問式是這樣的:

baseaddr +的sizeof(型)*指數

一個結構的大小是其元素加上由編譯器添加的任何填充的大小的簡單相加。所以這個結構的大小:

struct test { 
    int i; 
    char c; 
} 

可能是5.它也可能不是,因爲填充。

對於最後一個問題,很快(這非常複雜),MMU使用頁表將虛擬地址轉換爲物理地址,然後請求該地址,如果它在緩存中則返回,否則返回從主內存中提取。

2

您寫道:

是C程序足夠聰明,做基於數據型和指數的算術找出目標數據

是確切的內存地址,即正是他們所做的。它們不會迭代干預項目(因爲沒有標記來指導每個項目的開始和結束,所以這樣做不會有幫助。

+0

這很有道理! – user2127595

1

所以這裏是整個把戲,一個數組元素在內存中相鄰。

在聲明例如數組:int A[10];
可變A是一個指針陣列中的第一個元素。

現在是索引的一部分,無論何時你做A[i]這就好像你在做*(A+i)

索引只是數組起始地址的偏移量,同時請記住,在指針運算中,偏移量乘以數組數據類型的大小。

爲了更好地理解這個寫一點代碼,聲明一個數組並打印它的地址,然後打印數組中的每個元素的地址。 ,並注意偏移量總是如何相等,並等於機器上數組的數據類型的大小。

相關問題