Использование GCC (4.0 для меня), это юридический:Юридические использования setjmp и GCC
if(__builtin_expect(setjmp(buf) != 0, 1))
{
// handle error
}
else
{
// do action
}
Я нашел обсуждение о том, что вызвало проблемы для GCC еще в 2003 году, но я предположил бы, что они будут уже исправили его. Стандарт C говорит, что это незаконно использовать setjmp
, если это не один из четырех условий, соответствующая одна из которых это:
- один операнд реляционного или равенств оператора с другим операндом константы выражения целого с результирующее выражение - это все управляющее выражение выражения выбора или итерации;
Но если это расширение GCC, я могу гарантировать, что он будет работать под для GCC, так как это уже нестандартная функциональность? Я протестировал его, и он, похоже, сработал, хотя я не знаю, сколько тестов я должен был бы сделать, чтобы действительно сломать его. (Я скрываю вызов __builtin_expect
за макросом, который определяется как no-op для не-GCC, поэтому было бы совершенно законно для других компиляторов.)
Вам действительно нужен '__builtin_expect'? Я ожидал бы, что GCC будет рассматривать «setjmp» как особый случай и оптимизировать общий путь. Очень мало случаев появления этого шаблона в кодах google: http://google.com/codesearch?hl=ru&lr=&q=(__builtin_expect|likely).setjmp&sbtn=Search –
@Giuseppe - Наверное, нет, но всегда хорошо учиться , –
Весь '__builtin_expect' - смешная преждевременная оптимизация, которая убирает код для сомнительной выгоды. Если gcc имеет встроенный 'setjmp', он может даже оптимизировать весь условный код, указав, что' setjmp' сохраняет адрес иначе-недостижимого кода для ненулевого условия в буфере перехода напрямую, поэтому я думаю, что мы действительно имеем дело с Преждевременным Оптимизация считается вредной здесь. –