ASSERT(...)
C++ アプリケーションで使用するカスタムマクロがあります。
#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 に提供します。
アサーションは、定義により、true (つまりlikely
) と評価されることが期待されます。
ASSERT
マクロで同様のヒントを提供できますか? ここでの根底にあるメカニズムは何ですか?
明らかに、パフォーマンスの違いを測定しますが、理論的には違いがあるはずですか?
私は自分のコードを Linux でしか実行していませんが、クロスプラットフォームでこれを行う方法があるかどうか知りたいです。gcc も使用していますが、clang もサポートしたいと考えています。