【发布时间】:2013-06-13 08:44:07
【问题描述】:
我有一个项目要从 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 帮助条目是 here。 __unaligned 帮助表明不注意此警告将导致在 Itanium 处理器上引发异常。进一步搜索 MSDN 建议 there may be issues surrounding unaligned references。虽然这可能不会对我当前的用户造成问题,但如果 Itanium 架构在未来得到更广泛的使用,我可能会设置支持噩梦。现在计划为所有使用打包结构的函数添加特定的包装器,以避免指针和 __unaligned 关键字。
【问题讨论】:
标签: c++ 32bit-64bit memory-alignment