2012-10-17 54 views
1

如果我有一個int數組一些,讓我們只說:何時將類型應用於指針算術邏輯?

int iarr[5] = {0, 7, 3, 12, 99}; 

這是目前在地址0xbfdf53a8;我想打印出的該值與一個循環,我可以做這樣的事情:

for(i=0; i<5; i++) 
    printf("value of iarr[%d] = %d\n", i, *(iarr+i)); 

這個循環的工作,因爲我們通過一個「INT」每次遞增(地址由4被撞在典型的32位機器上進行每次迭代的字節)。

我的問題是,何時應用指定的字節偏移類型?是編譯過程的一部分(意味着它在程序集中),還是在操作系統級別完成?

我會假設這是如何以標準化的方式處理,但我還沒有找到答案。

+2

編譯器生成代碼來執行它。它知道它生成代碼的CPU /環境。 –

+0

'*(iarr + i)'完全等同於'iarr [i]'。當然,這是一種C語言功能,並且與OS完成的任何操作都沒有遠程關聯......但可以由具有索引指令的機器上的CPU完成。 –

回答

3

它是編譯過程的一部分,編譯器生成的代碼將操作數的大小考慮在內。

請注意,您可以使用指向5412字節struct的指針進行遞增和算術運算,就像指向4字節int的指針一樣容易。編譯器檢查指針表達式的類型並生成正確的代碼。

操作系統在這些底層細節中根本沒有涉及,它只是從過程的角度來看代碼。

+0

但是請注意,在某些機器上有'loadw address,index'指令可以自動進行乘法運算,但是沒有指令會自動乘以5412.OP可能會錯誤地將CPU級別的操作拖入「OS級別「,並沒有意識到編譯器已經掌握了關於目標機器的知識,使得它能夠生成高度專用於該機器的代碼。 –

1

它在編譯時完成,並將在彙編(和目標代碼)中生成。

操作系統不知道(而且不關心)你操作的數據類型。它只給你大量的(虛擬)原始內存。

只有你和編譯器知道數據類型及其特徵。