分享方式:


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 關鍵詞