在我的Windows C库中使用_try/_finally扩展有什么缺点吗?

在我的Windows C库中使用_try/_finally扩展有什么缺点吗?,c,windows,visual-c++,dll,seh,C,Windows,Visual C++,Dll,Seh,我正在用C语言编写一个特定于Windows的库,并且正在考虑使用C语言的Microsoft扩展来简化我的代码,以便在出现意外故障时清理资源。文中给出了一个例子 我不关心操作系统的可移植性,也不关心编译器的可移植性 目前为止我所发现的唯一负面结果是对标准C++异常处理的潜在干扰。有关详细说明,请参见文档页面和。对于.NET语言来说,情况似乎是安全的,但我担心C++用户可能无法设置正确的编译器选项,可能会遇到类似于./p>中所记录的一个不便。 这是一个合理的担忧吗?重新考虑使用try finally

我正在用C语言编写一个特定于Windows的库,并且正在考虑使用C语言的Microsoft扩展来简化我的代码,以便在出现意外故障时清理资源。文中给出了一个例子

我不关心操作系统的可移植性,也不关心编译器的可移植性

目前为止我所发现的唯一负面结果是对标准C++异常处理的潜在干扰。有关详细说明,请参见文档页面和。对于.NET语言来说,情况似乎是安全的,但我担心C++用户可能无法设置正确的编译器选项,可能会遇到类似于./p>中所记录的一个不便。
这是一个合理的担忧吗?重新考虑使用
try finally
语句是否还有其他缺点或原因?

\uuu try
/
\uu finally
仅用于SEH。它们不是通用的清理挂钩。在内部,它们引入代码来设置异常处理框架(x86)或向异常处理程序调度表(x64)添加条目。如果需要在C语言中执行清理,通常使用命名标签和
goto
s。或者使用C++来实现并公开C接口。C++“析构函数可以实现精简的RAII实现。@IInspectable谢谢,我对性能惩罚很感兴趣。但是,我读到MSVC在SEH的顶部构建了C++异常处理支持,并且除非实际引发异常,否则使用C++异常不会引起性能损失。这两者似乎都与您的评论相矛盾(imo应该升级为一个答案)。您会发现许多与此相矛盾的信息,主要是因为MSVC对x86和x64的SEH实现方式不同(我不知道其他体系结构是如何实现SEH的)。对于x86,MSVC无条件插入指令。即使没有引发异常,代码也需要执行。虽然便宜,但它仍然会占用宝贵的堆栈内存。x64使用基于表的EH;非抛出路径的代码开销为零,但EH代价高昂。此外,这些表是x64版本二进制大小增加的主要原因,这也会对运行时性能产生不利影响。