Позвольте мне предварить это, сказав, что я не профилировал этот код, и это не критический путь. Это в основном для моего собственного любопытства.
У меня есть функция, которая объявляет/определяет статический int с известным значением ошибки, которое заставит код выполнять ветвь. Однако, если функция завершится успешно, я точно знаю, что ветка больше никогда не будет взята. Есть ли оптимизация времени компиляции для этого? В частности, GNU/gcc/glibc?
Итак, у меня есть это:
static unsigned long volatile *getReg(unsigned long addr){
static int fd = -1;
if (fd < 0){
if (fd = open("file", O_RDWR | O_SYNC) < 0){
return NULL;
}
}
}
Итак, как только функция завершается успешно (если эта функция возвращает null, я выхожу из программы), я знаю, что fd будет действительным для всех будущих вызовов и никогда не выберет первую ветвь. Я знаю, что есть макрос __builtin_expect(), поэтому я мог написать
if (__builtin_expect((fd<0),0){
Но насколько я понимаю, это только ПОДСКАЗКА компилятору, и он все равно должен выполнить проверку условия. И я также понимаю, что в 99,9999% случаев этого будет более чем достаточно, так что любое дальнейшее увеличение производительности будет незначительным.
Мне было интересно, есть ли способ предотвратить даже первую проверку условия (fd ‹0 ) после самого первого запуска.