2010-02-23 43 views
1

documentation for the InterlockedExchangePointer Function状态:C++ InterlockedExchangePointer和指针对准

在一个64位系统,参数是64个位,而目标参数必须在64位边界对齐;否则,该功能将表现不可预知。在32位系统上,参数是32位,目标参数必须在32位边界上对齐。

编译为32位,并计划将在32位和64位架构运行;以下结构提供的指针是可由InterlockedExchangePointer在任何(32位或64位)运行架构上使用,无需代码适应

template <class T> 
struct Foo { 
    enum { count = 3 }; 
    __declspec(align(64)) T objects[count]; 
}; 

(我想,如果一个指针是在64位对准它也排列在32位 - 即使是填充如果在32位运行)

感谢。

+1

我不认为它很重要 - 64位和32位版本会生成不同的指令。在64位操作系统下运行32位二进制文​​件仍然会为您提供32位虚拟机。 – 2010-02-23 15:47:59

+0

根本不需要混淆__declspec。指针(与所有其他数据类型一样)在正常分配时自动对齐。这个文档说明只是指出,如果你手动搞砸了对齐 – jalf 2010-02-23 17:06:14

+0

jalf,那么我就搞不清分配的存储和非指针成员对象;无效*指针[计数]成为T对象[计数],所以这是不分配更多... – moala 2010-02-24 10:27:29

回答

2

在为32位平台编写的64位系统程序将通过兼容性层(WOW,Windows在Windows上)工作,并且您的指针必须在32位上对齐。但是,如果你以64位模式编译你的程序 - 你的指针将自动对齐到64位。

+0

我搞砸了分配的存储和非指针成员对象对齐;我编辑了成员类型(void * array - > T);如有必要,请查看您的答案。 – moala 2010-02-24 10:25:23

+0

@moala。在任何情况下,编译器默认情况下(如果不使用#pragma pack之类的thigs)将对齐32/64位边界上的指针。 – werewindle 2010-02-25 10:30:25