2013-11-25 57 views
4

我有以下代碼:差異數據對準

int byte_align(void * ptr) 
    { 
     int power = 2, n = 1, result = 0; 
     size_t address = reinterpret_cast<size_t>(ptr); 
     while(address%power == 0) 
     { 
      power *=2; 
      result = n; 
      n++; 
     } 
     return result; 
    } 

當我執行該功能(與-O3在Ubuntu編譯克++ 4.6),I得到有關每個雙變量運行不同的值(4,5,7,8)。爲什麼?在另一臺具有相同操作系統和相同編譯器的PC上,結果總是3。
這些結果有什麼其他可能的原因?
謝謝!

+0

你正在編譯32位還是64位? –

+2

你作爲ptr傳遞什麼? – Reunanen

+0

@Pukku:我通過一個地址加倍,例如'double x; func(&x);' –

回答

5

純粹的機會。取決於機器,雙倍數必須在4的倍數或8的倍數(在普通機器上)上對齊 。 8的對齊將返回3.或更多,因爲對齊16,32,64 ...的任何東西 也將對齊8.

您不會說指針來自何處,也不是上下文在你正在執行的 (DLL等)中,所以很難說更多。 出於安全原因,許多系統會在每次運行 程序時在不同的地址放置靜態數據,堆棧和/或空閒區域。

0

在具有大地址空間的機器上,變量可以位於大於4字節的邊界上(對於32位對齊)。

試試你的功能,這些樣本:
0x100的0x101,0x102,量0x104,量0x108,量0x110

從您介紹的情況,我只能說,程序可能無法可定位在每一個相同的地方調用。因此,指針可能有不同的值。

數據也是如此。