Udostępnij za pośrednictwem


Ostrzeżenie C4730 kompilatora (poziom 1)

"main" : mieszanie _m64 i wyrażeń zmiennoprzecinkowych może spowodować niepoprawny kod

Funkcja używa __m64 i float/double typów. Ze względu na to, że rejestry MMX i zmiennoprzecinkowe współdzielą tę samą fizyczną przestrzeń rejestru (nie można jej używać jednocześnie), użycie __m64 typów i float/double w tej samej funkcji może spowodować uszkodzenie danych, co może spowodować wyjątek.

Aby bezpiecznie używać __m64 typów i typów zmiennoprzecinkowych w tej samej funkcji, każda instrukcja używająca jednego z typów powinna być oddzielona _m_empty () (dla MMX) lub _m_femms() (dla funkcji 3DNow!).

Poniższy przykład generuje 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
}