2016-08-16 69 views
1

我不知道什麼假設編譯器作出關於內存對象的相對位置。編譯器假設對象

例如,如果我們每個都分配兩個大小爲1字節的堆棧變量,並且一個接一個地將它們初始化爲零,編譯器是否可以通過發出一條指令來優化這種情況,因爲它只用一個指令覆蓋存儲器中的兩個字節,編譯器知道兩個變量的相對位置?

我特別是在比較知名的編譯器等GCC,克++,鐺,Windows的C /愛好C++編譯器等

+2

可以嗎?當然是。會嗎?試試看。 –

回答

1

編譯器可以優化多個賦值爲一個。

a = 0; 
b = 0; 

可能成爲像

*(short*)&a = 0; 

細微部分,是「如果我們分配大小爲1字節每兩個堆棧變量,之後另一個」因爲你不能真正做到這一點。編譯器可以隨意亂轉堆棧位置。另外,簡單地聲明變量並不一定意味着任何堆棧分配。變量可能只是在寄存器中。在C,你將不得不使用alloca甚至不提供「層出不窮的權利」。

更一般情況下,C標準不允許您比較不同對象的內存位置。這是未定義的行爲。

+0

如果C標準將此定義爲未定義的行爲, gcc,是否符合標準並且不使用像這樣的優化? – user2600312

+1

@ user2600312這是不確定的行爲,如果你* *使用代碼這樣。如果它知道它去上班,它可以知道,因爲它是一種編譯以特定的方式特定目標的編譯器可以做到這一點 - 它可以使* *它的工作。 – harold

相關問題