2015-01-27 87 views
1

我想知道C++如何處理變量,以便整數變量的內存中的兩個地址相繼聲明和初始化的距離是3537492 - 3537480 = 12(我假設位(?))內存變量之間的距離

#include <cstdio> 

using namespace std; 

int main(int argc, char ** argv) 
{ 
    int x = 1; 
    int y = 2; 

    printf("int:\t%d\n", sizeof(int)); 
    printf("unsigned int:\t%d\n", sizeof(unsigned int)); 

    printf("Address of x\n\tHex:\t%p\n\tDec:\t%d\n", &x, &x); 
    printf("Address of y\n\tHex:\t%p\n\tDec:\t%d\n", &y, &y); 

    return 0; 
} 

輸出:

 
int: 4 
unsigned int: 4 
Address of x 
     Hex: 0035FA54 
     Dec: 3537492 
Address of y 
     Hex: 0035FA48 
     Dec: 3537480 
+4

這是12位_bytes_不是位。 – 2015-01-27 00:41:25

+2

您計算的差異是字節數。 C++如何處理變量完全是平臺,特定於編譯器設置。在某些情況下,變量不會保存在內存中。 – 2015-01-27 00:41:38

+0

你的問題是什麼? – 2015-01-27 00:41:52

回答

1

我的猜想會是編譯器沿着字邊界對齊整數出於一些性能原因。如果一個字是128位或16個字節,那麼這樣的行爲會導致變量之間的距離爲12個字節。你將不得不更多地瞭解你正在編譯的架構,以瞭解我是否正確。沒有雙關語意。見http://en.wikipedia.org/wiki/Data_structure_alignment

+0

我不認爲這可能是這種情況。首先,12個字節是變量的起始地址之間的差異,而不是它們之間的間隔的長度。其次,十六進制值清楚地表明兩個變量都不是16字節對齊的。 (即最低有效的十六進制數不爲零)。 – 2015-01-27 08:52:01

+0

這兩個都是好的,我的不好。 – Rich 2015-01-27 14:52:18

1

在存儲器的兩個變量之間的距離是最常見的是無意義的數。主要的例外是兩個數組元素。

這也不例外:你得到的數字是12,巧合。如果你試圖計算它「藍色」在技術上將是一個法律結果。這是因爲比較不相關的指針是未定義的行爲,然後從字面上任何事情都可能發生。

此外,您獲得的值可能因運行而異。 (在許多現代操作系統中,這是出於安全原因的情況,當它總是在移動時很難破解它)

+0

理論上,編譯器是否可以決定將指針實現爲字符串? – BWG 2015-01-27 01:26:06

+0

實際上,它們必須是固定的長度('sizeof(T *)'是一個常數)。 – MSalters 2015-01-27 16:30:57

1

我想你在Visual Studio 調試配置編譯此代碼。在這種模式下,編譯器會在變量之間進行額外的內存分配以檢測可能的堆棧損壞。嘗試切換到版本,你會看到距離變成了4個字節。 關於題目的更多信息: https://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx