Share via


fenv_access pragma

停用 ( on ) 或啟用 off () 優化,以變更浮點環境旗標測試和模式變更。

語法

#pragma fenv_access ( { on | off } )

備註

根據預設, fenv_accessoff 。 編譯器假設您的程式碼無法存取或操作浮點環境。 如果不需要環境存取,編譯器可以執行更多動作來優化浮點程式碼。

fenv_access如果您的程式碼測試浮點狀態旗標、例外狀況或設定控制模式旗標,請啟用 。 編譯器會停用浮點優化,因此您的程式碼可以一致地存取浮點環境。

/fp:strict命令列選項會自動啟用 fenv_access 。 如需此行為和其他浮點行為的詳細資訊,請參閱 /fp (指定浮點行為)。

您可以搭配其他浮點設定使用 fenv_accesspragma 的方式有一些限制:

  • 除非啟用精確的語意,否則您無法 fenv_access 啟用。 您可以使用 或 /fp:precise/fp:strict 編譯器選項來啟用 float_controlpragma 精確的語意。 如果未指定其他浮點命令列選項,編譯器會預設 /fp:precise 為 。

  • 設定時 fenv_access(on) ,您無法使用 float_control 來停用精確的語意。

指示 fenv_access(on) 詞會停用產生浮點合約 、結合浮點 作業的電腦指令。 fenv_access(off) 會還原先前的合約行為。 此行為是 Visual Studio 2022 的新功能。 舊版編譯器預設可能會在 下 fenv_access(on) 產生合約。 如需浮點收縮的詳細資訊,請參閱 /fp:contract

受限 fenv_access 于的優化類型如下:

  • 全域通用子運算式刪除

  • 程式碼移動

  • 常數摺疊

其他浮點 pragma 指示詞包括:

範例

本範例會將 設定 fenv_accesson ,以設定 24 位精確度的浮點控制項暫存器:

// 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(&currentControl, _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

如果您將先前的範例批註化 #pragma fenv_access (on) ,輸出會有所不同。 這是因為編譯器會進行編譯時間評估,而該評估不會使用控制項模式。

// 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(&currentControl, _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

另請參閱

Pragma 指示詞和 __pragma_Pragma 關鍵字