在C ++库中有错误代码选项以提高性能

时间:2012-12-29 09:34:56

标签: c++ exception error-code

我编写了一个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,唯一可以抛出异常的是new关键字,我打算添加nothrow。 UTF-8代码也可以抛出异常(也需要更改)

char *parr = new (nothrow) char[num];

if(parr==NULL)
    // handle it either through error code or throw exception (if enabled)

请告知我是否应该采用纯异常方法或混合方法(如上所述),因为我的库错误。谢谢。

1 个答案:

答案 0 :(得分:0)

这取决于您想要对库执行的操作。从设计的角度来看,显然例外情况更好,但对于某些类型的应用程序(例如沉浸式3D游戏),它们通常会被禁用。