我有以下代码:
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上用g++4.6编译)时,我会在每个运行不同的值(4、5、7、8)上得到一个双变量。为什么?在另一台具有相同操作系统和相同编译器的PC上,我得到的结果总是3。
产生这些结果的其他可能原因是什么?
谢谢!
发布于 2013-11-25 14:09:22
纯粹的机会。根据机器的不同,双对齐必须对齐倍数为4或倍数为8(在普通机器上)。对齐8将返回3或更多,因为任何对齐的16,32,64.也将对齐8。
您没有说明指针来自何处,也没有说明您正在执行的上下文(DLL等),因此很难说得更多。出于安全考虑,许多系统在每次运行程序时都会将静态数据、堆栈和/或空闲空间放置在不同的地址。
发布于 2013-11-25 14:06:21
在具有大地址空间的机器上,变量可以位于大于4个字节的边界上(对于32位对齐)。
使用以下示例尝试您的功能:
0x100,0x101,0x102,0x104,0x108,0x110
根据您提供的信息,我只能说程序可能不在每次调用的相同位置。因此,指针可能具有不同的值。
数据也是如此。
https://stackoverflow.com/questions/20194863
复制相似问题