fenv_access
pragma
Wyłącza () lub włącza optymalizacje (on
off
), które mogą zmieniać testy flag środowiska zmiennoprzecinkowego i zmiany trybu.
Składnia
#pragma fenv_access (
{on
|off
})
Uwagi
Domyślnie fenv_access
jest to off
. Kompilator zakłada, że kod nie uzyskuje dostępu do środowiska zmiennoprzecinkowego ani nie manipuluje nim. Jeśli dostęp do środowiska nie jest wymagany, kompilator może zrobić więcej, aby zoptymalizować kod zmiennoprzecinkowy.
Włącz fenv_access
, jeśli kod testuje flagi stanu zmiennoprzecinkowe, wyjątki lub ustawia flagi trybu sterowania. Kompilator wyłącza optymalizacje zmiennoprzecinkowe, dzięki czemu kod może spójnie uzyskiwać dostęp do środowiska zmiennoprzecinkowego.
/fp:strict
Opcja wiersza polecenia automatycznie włącza fenv_access
wartość . Aby uzyskać więcej informacji na temat tego i innych zachowań zmiennoprzecinkowych, zobacz /fp (Określ zachowanie zmiennoprzecinkowe).
Istnieją ograniczenia dotyczące sposobów używania w połączeniu fenv_access
pragma z innymi ustawieniami zmiennoprzecinkowych:
Nie można włączyć
fenv_access
, chyba że włączono dokładną semantyka. Dokładna semantyka może być włączona przezfloat_control
pragmaelement lub przy użyciu opcji kompilatora/fp:precise
lub/fp:strict
. Kompilator domyślnie ma/fp:precise
wartość domyślną, jeśli nie określono żadnej innej opcji wiersza polecenia zmiennoprzecinkowego.Nie można użyć
float_control
polecenia , aby wyłączyć dokładną semantyka pofenv_access(on)
ustawieniu.
Dyrektywa fenv_access(on)
wyłącza generowanie skurczów zmiennoprzecinkowych, instrukcje dotyczące maszyn, które łączą operacje zmiennoprzecinkowe. fenv_access(off)
przywraca poprzednie zachowanie dla skurczów. To zachowanie jest nowe w programie Visual Studio 2022. Poprzednie wersje kompilatora mogą domyślnie generować skurcze w obszarze fenv_access(on)
. Aby uzyskać więcej informacji o skurczach zmiennoprzecinkowych, zobacz /fp:contract
.
Rodzaje optymalizacji, które podlegają fenv_access
:
Globalna wspólna eliminacja podrażenia
Ruch kodu
Stałe składanie
Inne dyrektywy zmiennoprzecinkowe pragma obejmują:
Przykłady
W tym przykładzie ustawiono ustawienie fenv_access
on
rejestru sterowania zmiennoprzecinkowego na 24-bitową precyzję:
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03
Jeśli oznaczysz komentarz #pragma fenv_access (on)
z poprzedniego przykładu, dane wyjściowe będą inne. Jest to spowodowane tym, że kompilator wykonuje ocenę czasu kompilacji, która nie korzysta z trybu sterowania.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02