是否有一个gcc选项假设所有extern“C”函数都不能传播exception?
有没有办法,除了在每个函数原型上放置一个属性,让gcc知道C函数永远不会传播exception,即在extern "C"
声明的所有函数都应该是__attribute__((nothrow))
? 理想的是-f
风格的命令行选项。
您始终可以使用-fno-exceptions
,这将确保c ++编译器不会生成exception传播代码。
边注:
你确定告诉编译器“所有这些funcs永远不会抛出”正是你想要的吗?
extern "C" ...
函数不一定能传播/触发exception。 举一个例子:
class Foo { public: class Away {}; static void throwaway(void) { throw Away(); } } extern "C" { void wrap_a_call(void (*wrapped)(void)) { wrapped(); } } int main(int argc, char **argv) { wrap_a_call(Foo::throwaway); return 0; }
编译并运行它会创建一个C-linkage函数wrap_a_call()
,当像上面那样调用它时,会wrap_a_call()
导致exception:
$ ./test terminate called after throwing an instance of 'Foo::Away' Abort(coredump)
即extern "C"
(通过调用函数指针)可能存在“exception泄漏”,并且因为您在C ++中的特定位置使用/调用extern "C"
函数并不能保证在调用时不会抛出任何exception那些。
当引发exception时,它会生成中断,展开堆栈并覆盖现有堆栈。 它达到了try / except语法的地步。 如果您不使用exception,这意味着您没有任何开销。 只有内存/时间的开销是在try / catch块中,而堆栈在throw()中展开。
如果您的c函数不会产生exception,那么当您在C ++中调用try / catch时,您的开销只会在空间中,但对于任何数量的exception都是相同的。 (初始化这个小空间丝毫不变的时间开销很小)。
GCC 4.5似乎会自动为我优化这些。 实际上,这一行出现在http://gcc.gnu.org/gcc-4.5/changes.html的更改列表中:
- GCC现在优化exception处理代码。 特别是被certificate没有任何影响的清理区域被优化出来。