このコードのプロファイルを作成しておらず、クリティカルパスでもないということで、この前置きをさせてください。これは主に私自身の好奇心のためです。
静的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)さえも防ぐ方法があるのではないかと思いました。