为什么c++ assert() 函数会给程序带来开销

Coi*_*ung 1 c++ assert

我有练习使用c++ assert 来检查程序是否正常运行,比如这样:

cv::Mat im = imread("pic.jpg")
assert(!im);
Run Code Online (Sandbox Code Playgroud)

这将检查图像是否被正确读取。这很有用,因为图像可能没有正确放置在预期的目录中,因此我们需要检查。我觉得assert使用方便,但有人说使用assert会给程序带来开销,建议不要使用。为什么assert会带来开销?在这种情况下检查的好做法是什么?

bla*_*ami 5

首先,assert()不是一个普通的函数。这是一个看起来与此类似的宏:

#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation*/
#endif
Run Code Online (Sandbox Code Playgroud)

如您所见,它仅在NDEBUG未定义时启用并执行某些操作。它旨在用于在调试模式下运行时对程序进行额外检查,以帮助更快地查明错误(例如错误的参数、不成立的不变量等)。

如果您按所示使用断言,它本身可能不会花费太多性能,但是由于我上面写的内容 - 它是调试工具 - 可能会在代码库的许多地方使用。如果传递给 assert 的条件很复杂,那么肯定需要时间来评估它们(您的客户不必担心,因为这只会在调试模式下发生,因此它们不会受到影响 -NDEBUG所有开销都会消失)。

您不应该使用assert()来验证您想要始终验证的内容(也在非调试模式下)。在这种情况下,正确的做法是:

cv::Mat im = imread("pic.jpg")
if (!im) {
   /* handle error ... */
}
Run Code Online (Sandbox Code Playgroud)

  • @CoinCheung 我觉得你已经跳过了这个答案中解释“assert”在这里不合适的部分。`assert` 不应该被用来检查可能失败的东西。它只应用于检查您已经知道的始终为“true”的东西是否实际上是“true”。 (3认同)