относительно __builtin_expect?
Это специально чтобы не юзали?
Не, я понимаю, компилятору проще если помечают пути, но людям же легче оценить результат cmp, а не вероятность пути(которые ещё и инлайниться могут)
У меня вопрос возник в связи с тем что автозамена не сказать, что работает
Например, допустим у меня было выражение
if (builtin_based_likely(kek)) {
if (builtin_based_unlikely(kek2)) {
...
}
...
}
кажется правильно его будет переписать так:
if (kek) {
if (kek2) [[unlikely]] {
...
}
[[likely]]...
}
а не так:
if (kek) [[likely]] {
if (kek2) [[unlikely]] {
...
}
...
}
Почему? (Идея понятна, речь о результатах, которые выдают реальные компиляторы)
Результаты зависят от конкретного кода, для простых примеров я не знаю примера с разницей Просто проблема что эквивалент builtin_expect в принципе пишется с помощью новых атрибутов, но ведь оно не предлагается так делать #define MY_BUILTIN_EXPECT_1(cond) [&] { if (!!(cond)) [[likely]] { return true; } // automatically unlikely return false; }() Не уверен насколько компиляторы хорошо это компилят, но суть такая В общем я не понимаю мотивацию тащить более сложное для правильного использования решение
по моему всё максимально просто и понятно, [[likely]] если условие likely да и всё...
Обсуждают сегодня