我有练习使用c++ assert 来检查程序是否正常运行,比如这样:
cv::Mat im = imread("pic.jpg")
assert(!im);
Run Code Online (Sandbox Code Playgroud)
这将检查图像是否被正确读取。这很有用,因为图像可能没有正确放置在预期的目录中,因此我们需要检查。我觉得assert使用方便,但有人说使用assert会给程序带来开销,建议不要使用。为什么assert会带来开销?在这种情况下检查的好做法是什么?
首先,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)