C言語のヘッダファイルのstatic inline関数および_attribute__(always_inline))強制インライン展開

2577 ワード

ヘッダファイルのstatic inline関数
主な学習の参考は以下の通りで、本文はC言語に基づいて、C++の中でstaticは異なる作用があります:https://blog.csdn.net/huanghui167/article/details/41346663 https://www.runoob.com/w3cnote/cpp-inline-usage.html
まず、inlineはインラインを提案するだけで、インラインを強制することはなく、gccがO 3の最適化レベルに達しても、インラインしない可能性があることを明らかにした.
Linuxシステムの下でobjdumpコマンドを使用すると、実行可能なファイルの逆アセンブリファイルを見て、具体的なインラインの有無を見ることができます.インラインが成功しなければ、関数呼び出しプロセスが表示されるはずです.
私は主にinline関数を使うことを目的としていますが、inline関数の定義は一般的にヘッダファイルに置いてあります.他のソースファイルが使うときは、inline関数を定義したヘッダファイルincludeを直接入れてください.ソースファイルで定義し、ヘッダファイルで宣言すると、各ソースファイルが独立してコンパイルされているため、コンパイルが完了した後は通常の関数と同じように呼び出すことができます.
次に、ヘッダファイルでinlineを使用してstaticに参加することをお勧めします.
1、以上から分かるように、inline関数は単にインラインを提案するだけで、インラインしない可能性があるので、inline関数がインラインしていない場合、それは普通の関数として呼び出されるだけである.2、次にinline関数はヘッダファイルに多く使われるので、最終的には1つの普通の関数がヘッダファイルに定義されるのと同じで、また複数のソースファイルに含まれると、再定義される場合があります.3、C言語については、ヘッダファイルに定義された関数にstaticを加えることをお勧めします.追加しないと、複数のソースファイルに含まれ、コンパイルは通過しません.
インライン展開の強制
ARMシステムでは、関数に__attribute__((always_inline))属性を追加してinline関数を強制的に展開することができるが、attributeはGNU Cの特色の一つであるため、ARMに限られる.だから実はwinシステムの下でどのように強制的なインライン展開を使うかよく分かりません.
では、ARM Linuxの場合、static inline関数の定義を次の形式に変更できます.
static inline __attribute__((always_inline)) void f()

注(一部は菜鳥チュートリアルから引用):
インラインインラインを慎むことで関数の実行効率を高めることができますが、なぜすべての関数をインライン関数として定義しないのですか?すべての関数がインライン関数であれば、「インライン」というキーワードは使えますか?インラインはコードで膨張します(コピー)を対価として、関数呼び出しのオーバーヘッドを省くだけで、関数の実行効率が向上します.関数内のコードを実行する時間が、関数呼び出しのオーバーヘッドよりも大きい場合、効率の収穫は少なくなります.一方、各インライン関数の呼び出しは、プログラムの総コード量を増大させ、より多くのメモリスペースを消費します.
逆アセンブリコードを確認すると、次の問題が発生する可能性があります.
1、アセンブラコードに長いジャンプ(コードが長すぎるため)が現れ、短いジャンプより時間がかかる.2、レジスタが足りない.すべてのコードが一つのファイルにあるため、もともと関数の中でスタック内で解決できる変数には追加のレジスタが必要である.
(1)関数内のコードが長い場合、内部のコードを使用するとメモリ消費コストが高くなります.(2)関数内にループが発生すると、関数内のコードを実行する時間が関数呼び出しのオーバーヘッドよりも大きくなります.
インライン関数をまとめるのは、性能を強化する賢い薬ではありません.関数が非常に短いときだけ、私たちが望んでいる効果を得ることができます.しかし、関数が短くなく、多くの場所で呼び出されると、実行可能体の体積が増大する.最も悩ましいのは、コンパイラがインラインを拒否したときです.古い実現の中で、結果はとても望ましくなくて、新しい実現の中でとても大きい改善があって、しかし依然としてそんなに完備していません.いくつかのコンパイラは、どの関数がインラインできるのか、できないのかを指摘するのに十分な聡明さを持っていますが、多くのコンパイラはそれほど賢くありません.そのため、私たちの経験が必要です.インライン関数がパフォーマンスを向上させない場合は、使用しないでください.