2013-11-25 30 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

从您介绍的情况,我只能说,程序可能无法可定位在每一个相同的地方调用。因此,指针可能有不同的值。

数据也是如此。