У меня есть пользовательский макрос 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 following semicolon
#else
#define ASSERT(expr)
#endif
Недавно я читал код модуля ядра Linux и сталкивался с наличием макросов likely(...)
и unlikely(...)
. Они дают указание процессору, что данная ветка более вероятна, и что конвейер должен оптимизировать для этого пути.
Утверждения, по определению, должны оцениваться как истинные (т.е. likely
).
Могу ли я предоставить аналогичный намек в моем макросе ASSERT
? Какой здесь основной механизм?
Очевидно, я буду измерять любую разницу в производительности, но теоретически это должно иметь какое-то значение?
Я только запускаю свой код в Linux, но мне было бы интересно узнать, есть ли кросс-платформенный способ сделать это тоже. Я также использую gcc, но также хотел бы поддержать clang.