我有一个项目要从 32 位 Windows 移植到 64 位,其中包括可以简化如下的代码:
void FuncA(double &x)
{
x = 0;
}
void FuncB(double *x)
{
*x = 0;
}
#pack(1)
struct
{
char c;
double x;
} MyStruct;
#pack();
void MyFunc()
{
MyStruct M;
FuncA(M.x); // This is OK
FuncB(&M.x); // This generates a warning C4366
}
在针对 64 位的 VS2010 SP1 下编译时,FuncB
使用打包结构的成员调用会生成以下警告:
警告 C4366:一元“&”运算符的结果可能未对齐
而调用FuncA
没有。我原以为这两种情况都会编译成几乎相同的代码。引用在对齐问题上是否比等效指针更安全?还是 MSVC 根本没有在应该发出警告的地方发出警告?该项目需要维护结构包装,因此我的选择是更改FuncB
为
void FuncB(__unaligned double *x)
{
*x = 0;
}
或简单地FuncA
在所有此类情况下使用。后者更可取,因为它更便携,但我想知道它是否会起作用,或者在参考案例中缺少警告仅仅是编译器中的一个缺点?
编辑: 此错误的 Microsoft 帮助条目在此处。__unaligned帮助表明不注意此警告将导致在 Itanium 处理器上引发异常。进一步搜索 MSDN 表明可能存在围绕未对齐引用的问题。虽然这可能不会对我当前的用户造成问题,但如果 Itanium 架构在未来得到更广泛的使用,我可能会设置支持噩梦。现在计划为所有使用打包结构的函数添加特定的包装器,以避免指针和 __unaligned 关键字。