我在C++应用程序中使用一个自定义的ASSERT(...)
宏。
#include <stdlib.h>
#include <iostream>
/// ASSERT(expr) checks if expr is true. If not, error details are logged
/// and the process is exited with a non-zero code.
#ifdef INCLUDE_ASSERTIONS
#define ASSERT(expr) \
if (!(expr)) { \
char buf[4096]; \
snprintf (buf, 4096, "Assertion failed in \"%s\", line %d\n%s\n", \
__FILE__, __LINE__, #expr); \
std::cerr << buf; \
::abort(); \
} \
else // This 'else' exists to catch the user's following semicolon
#else
#define ASSERT(expr)
#endif
最近我在阅读一些Linux内核模块代码时,发现了likely(...)
和unlikely(...)
宏的存在。它们向CPU提供了一个提示,表明给定分支更可能被执行,因此流水线应优化该路径。
断言通常情况下应该为真(即likely
)。
我能否在我的ASSERT
宏中提供类似的提示?这里的基本机制是什么?
显然,我会测量任何性能差异,但理论上应该有任何差异吗?
我只在Linux上运行我的代码,但也想知道是否有跨平台的方法。我还使用gcc,但也想支持clang。
ASSERT
,否则它真的不会有任何影响。此外,分支预测对于这些一致的分支来说已经相当不错了,因此即使在性能关键的循环中,在现代CPU上也不应该有太大的差异。 - Paul Rlikely
和unlikely
。 - user703016else
。在 C 语言中,空语句是完全可以接受的,而且不会改变代码的含义。if (foo) {};
和if (foo) {}
没有任何区别。 - Blacklight Shining