我有使用c++断言来检查程序是否正常运行的实践,例如:
cv::Mat im = imread("pic.jpg")
assert(!im);
这将检查图像读取是否正确。这很有用,因为图像可能没有正确放置在预期的目录中,所以我们需要检查。我觉得使用assert
很方便,但人们说使用assert
会给程序带来开销,建议不要使用它们。为什么assert
会带来开销?在这种情况下,检查的最佳做法是什么?
首先,assert()
不是一个普通的函数。这是一个看起来类似的宏:
#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation*/
#endif
正如您所看到的,它仅在未定义CCD_ 5时启用并执行某些操作。它用于在调试模式下运行时对程序进行额外的检查,以帮助更快地确定错误(例如错误的参数、不成立的不变量等(。
如果您使用如图所示的断言,它本身可能不会花费那么多性能,但由于我在上面所写的内容——它是调试工具——可能会在代码库的许多地方使用。如果传递给断言的条件很复杂,请确保评估这些条件可能需要时间(您的客户不必担心,因为这只会在调试模式下发生,所以他们不会受到影响——有了NDEBUG
,所有开销都会消失(。
您不应该使用assert()
来验证您想要始终验证的东西(也可以在非调试模式下(。在这种情况下,正确的做法是:
cv::Mat im = imread("pic.jpg")
if (!im) {
/* handle error ... */
}
为什么c++assert((函数会给程序带来开销
首先,assert
在技术上不是一个函数。这是一个宏。
回答这个问题:这取决于情况。如果断言被禁用,那么就不会有检查,也就不会有开销。如果启用了断言,那么是的,与不进行检查相比会有开销(除非编译器能够在编译时证明检查是不必要的(。
任何额外的代码都会添加"开销";添加到程序中,比如添加执行时间、代码大小,可能还有内存大小
对于使用assert()
的代码也是如此(除了assert()
仅完成其工作并且仅在活动时使用任何资源的细节之外,即如果未使用-DNDEBUG
;此细节归功于DevSolar(。
不管有没有assert()
,这两种代码都会被添加到程序中,因为它们当然有一定的用途。
您已经清楚、充分地描述了使用assert()
的目的
现在的问题不是它是否使用任何资源,而是你是否想达到目的,为此你可能愿意为使用的资源付出代价
由于您似乎非常清楚这些好处,因此使用assert()
似乎是一个适当的决定。
如果您要求使用assert()
的任何替代方案,答案是在不使用任何资源的情况下,没有任何替代方案支持相同的目的。
你可能还想考虑一下,在你不再需要自检功能的情况下(在我看来,这通常是永远不需要的(;没有开销";,然后您可以使用上面提到的开关来消除资源消耗。