Позвольте мне предварить это, сказав, что я не профилировал этот код, и при этом это не критический путь.Это в основном для моего собственного любопытства.
У меня есть функция, которая объявляет / определяет static 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;
}
}
}
Итак, как только функция завершается успешно (если эта функция возвращает ноль, я выхожу из программы), я знаю, что fdдля всех будущих вызовов будет действительным и никогда не будет принимать первый филиал.Я знаю, что есть макрос __builtin_expect (), поэтому я мог написать
if (__builtin_expect((fd<0),0){
Но из того, что я понимаю, это только подсказка компилятору, и он все еще должен выполнять проверку условия.И я также понимаю, что в 99,9999% случаев этого будет более чем достаточно, чтобы любое дальнейшее увеличение производительности было незначительным.
Мне было интересно, существует ли способ предотвратить даже первую проверку состояния (fd <0) после первого запуска. </p>