0

関数を効率的に使用するために、インライン関数と通常の関数として使用しているときに、関数が使用するメモリの量を見つける方法を知りたいです。

どちらの場合も正確なメモリ使用量を計算したいと思います。

4

1 に答える 1

0

プログラムのサイズと実行時のメモリ使用量(スタックとレジスタ)のどちらを懸念しているかを明確にする必要があります。

さらに、各呼び出しサイトに対して本質的にかなりの作業を行う機能の場合、プログラムのサイズに関してインライン化することによるメリットはわずかです。本質的に大量のメモリを使用する必要がある関数の場合(球場の感じの数字の場合は100バイト以上と言います)、インライン化してもしなくても違いはありません。ただし、「本質的に」は、各呼び出しサイトの実際のニーズが異なる可能性があるという事実をエンコードするため、特定の呼び出しサイトのニーズをコンパイル時に決定することで、大幅な最適化の機会が得られる場合(たとえば、デッドコードの除去)、インライン化が役立つ場合があります。

インライン関数は、呼び出された各ポイントで効果的に置き換えられ、最適化されます。最適化により、使用するレジスタとメモリが変更される可能性があります。マシンコード命令(つまりプログラム)に使用されるメモリ、またはスタックとレジスタに使用されるメモリのどちらを意味する場合でもかまいません。デッドコードの除去などの最適化(そのコードによって示されるメモリ使用量とともに)は、ある呼び出し元では可能ですが、別の呼び出し元では不可能な場合がありますが、オフライン関数を呼び出すときにそのコードブランチが実行されなかった場合、多くの可能性はありません。とにかくメモリ使用量の違い。これに対抗するために、関数のサイズに応じて、インライン化後に通常発生する可能性のある最適化の量、呼び出しサイトの数、およびオフラインで呼び出すときに引数を準備して渡すために必要なコードの量、どちらのアプローチでも、全体的なコードの膨張が多かれ少なかれ生じる可能性があります。インライン化を使用すると、過度のコード膨張のリスクが高まりますが、コンパイラーは通常、妥当なしきい値を超えたときに「インライン」キーワードヒントを尊重しないことを選択します。

ほとんどの最適化オプションと同様に、気になる場合は、現実的なデータ/イベントの負荷を使用して特定のアプリケーションを測定する必要があります。

于 2012-12-04T12:43:00.563 に答える