在c++库中提供错误码选项以提高性能

Having error codes option in C++ library for performance

本文关键字:误码 选项 高性能 错误 c++      更新时间:2023-10-16

我写了一个c++文件库,它有异常和错误代码。可以在程序运行时禁用异常。在这种情况下,用户必须检查错误代码。当然,当启用异常抛出时,不会返回错误代码,因为异常是在被调用函数返回之前抛出的。目前,在禁用时仍然可能抛出异常(bug)。我很快就会修好。有人对我说,同时拥有异常和错误代码被认为是糟糕的设计。我同意他的观点,我即将删除错误代码,并让库抛出带有更多错误信息的自定义派生异常。但我犹豫了。出于性能原因,我喜欢使用这种混合方法。这就是我想做的:保留异常抛出和错误代码,但异常抛出是通过宏在编译时而不是运行时禁用的。

如果用户在公共配置文件中定义以下内容

#define ELMAX_EXCEPTION 1

后面的代码

int Write(std::wstring str) ELMAX_THROW_OR_NOT;

将展开为2中的任意一个

// under C++11 compiler
int Write(std::wstring str) noexcept;
// under C++98 compiler
int Write(std::wstring str) throw();

如果ELMAX_EXCEPTION没有定义或为零,宏将展开为零。

int Write(std::wstring) ;

我想这样做的原因是,对于那些希望不让编译器生成堆栈展开代码(对于例外)而获得性能提升的库用户来说,编译器可以更好地优化这些函数。我的c++文件库使用C文件API,唯一可能抛出异常的是新关键字,我打算添加nothrow。UTF-8代码也会抛出异常(也需要修改)

char *parr = new (nothrow) char[num];
if(parr==NULL)
    // handle it either through error code or throw exception (if enabled)

请告知我是否应该使用纯异常方法或混合方法(如上所述)来处理我的库错误。谢谢你。

这取决于你想用这个库做什么。显然,从设计的角度来看,例外情况更好,但某些类型的应用(如沉浸式3D游戏)经常禁用它们。