编译器警告(等级 1)C4730
“main”:混合 _m64 和浮点表达式可能导致不正确的代码
函数使用 __m64 和 float
/double
类型。 由于 MMX 和浮点寄存器共享相同的物理寄存器空间(不能同时使用),因此在同一函数中使用 __m64
和 float
/double
类型会导致数据损坏,从而可能引发异常。
若要在同一函数中安全使用 __m64
类型和浮点类型,则使用其中一种类型的每个指令应该用内部的 _m_empty()(适用于 MMX)或 _m_femms()(适用于 3DNow!)进行分隔。
下面的示例生成 C4730:
// C4730.cpp
// compile with: /W1
// processor: x86
#include "mmintrin.h"
void func(double)
{
}
int main(__m64 a, __m64 b)
{
__m64 m;
double f;
f = 1.0;
m = _m_paddb(a, b);
// uncomment the next line to resolve C4730
// _m_empty();
func(f * 3.0); // C4730
}