数据对齐的差异

4

I have the following code:

    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;
    }

当我在Ubuntu上使用g++4.6编译并使用-O3优化参数执行该函数时,每次运行都会得到不同的双精度变量值(4、5、7、8)。为什么呢?在另一台具有相同操作系统和编译器的计算机上,我总是得到3作为结果。
这些结果可能的其他原因是什么?
谢谢!


你是在编译32位还是64位? - Thomas Matthews
2
你传递什么作为 ptr? - Reunanen
@Pukku:我将一个地址传递给一个双精度浮点数,例如 double x; func(&x); - arc_lupus
2个回答

5

纯粹的机会。根据计算机不同,双精度浮点数必须在4的倍数或8的倍数(通用计算机)上对齐。一个8字节的对齐将返回3或更多,因为任何16、32、64等对齐的东西也将对齐到8。

您没有说明指针来自哪里,也没有说明您执行时的上下文(DLL等),因此很难再说更多。出于安全原因,许多系统每次运行程序时都会将静态数据、堆栈和/或自由空间放置在不同的地址处。


0

在具有大地址空间的计算机上,变量可以位于大于4字节(32位对齐)的边界上。

请使用以下示例测试您的函数:
0x100、0x101、0x102、0x104、0x108、0x110

从您提供的信息来看,我只能说程序可能不会在每次调用时位于相同的位置。因此,指针可能具有不同的值。

数据也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接