gcc turn off exceptions:-fno-exceptions

在g++編譯時,程式若為了效能考量可能希望減少執行時對exception機制的overhead,可用-fno-exceptions 這個選項關掉exception
但此時就無法使用try catch 可用 #if __cpp_exceptions 來做處理,
或是使用c processor的predefined macro

https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
__EXCEPTIONS
This macro is defined, with value 1, when compiling a C++ source file with exceptions enabled. If -fno-exceptions is used when compiling the file, then this macro is not defined.

int main()
{
 #if __cpp_exceptions
  throw "123";
 #endif
}

g++ -fno-exceptions test.cc
關掉exception後就不可以用try catch throw了

若不用exception機制時 則要小心所使用的library是否會拋出exception
以g++的libstdc++來說 利用macro處理 try catch throw等 可在編譯(libstdc++)時關掉exception
在bits/exception_defines.h (libstdc++-v3\libsupc++\exception_defines.h)

#ifndef __EXCEPTIONS
// Iff -fno-exceptions, transform error handling code to work without it.
# define __try      if (true)
# define __catch(X) if (false)
# define __throw_exception_again
#else
// Else proceed normally.
# define __try      try
# define __catch(X) catch(X)
# define __throw_exception_again throw
#endif

這時在STL library的throw 在-fno-exceptions之下會呼叫abort()
參考libstdc++-v3/src/c++11/functexcept.cc _GLIBCXX_THROW_OR_ABORT

但注意 編譯選項-fno-exceptions 只是當下編譯的選項,而有些library原本在編譯時是啟用exception的,程式link library object以後如果有exception,結果會是程式接不到exception而中止

因libstdc++.so 預設有exception,所以儘管有-fno-exceptions,使用到stl有exception時一樣會中止
除非是對STL另外編譯no exception版本,雖然一樣是abort()
這樣變得使用STL反而會要考慮底層的function是否會產生exception,反而是負擔了~

-fno-exceptions 這種情況比較適合是使用C的library 把C++當成better C來使用,或是使用的函式庫是在可以掌握不會有exception的情況下才適合使用

This entry was posted in Tips. Bookmark the permalink.

Leave a Reply