追加のヘッダー ファイルを含めると、必要な RAM サイズが増加しますか? たとえば、次の場合、より多くの RAM が必要に#include <stdio.h>
なり#include <string.h>
ますか?
CNU C コンパイラを使用して組み込みシステム ソフトウェアを作成しているので、必要な RAM をできるだけ最小限に抑えたいと考えています。
追加のヘッダー ファイルを含めると、必要な RAM サイズが増加しますか? たとえば、次の場合、より多くの RAM が必要に#include <stdio.h>
なり#include <string.h>
ますか?
CNU C コンパイラを使用して組み込みシステム ソフトウェアを作成しているので、必要な RAM をできるだけ最小限に抑えたいと考えています。
少なくとも標準ライブラリのヘッダーについて話しているときは、本当に聞きたいことに対する答えはおそらく「いいえ」です。それらを含めても、実行可能ファイルのサイズやメモリ フットプリントに違いはありません。それにもかかわらず、私は反対の反応を示さずにはいられません。
インクルードファイルの内容によって異なります。システムヘッダーはそれを行いませんが、理論的には、そのファイルには何でもかまいません。ヘッダーに関数プロトタイプと型定義のみが含まれていることは、単なる慣習です。これらの 2 つのファイルがある場合:
// foo.c
int bigarray[1000];
と
// bar.c
#include "foo.c"
int main(int argc, char**argv()) {
return 0;
}
これは正当なコードであり、bar.c は適切にコンパイルされますが、foo.c の配列のためにメモリ フットプリントが 4K 大きくなる可能性があります (コンパイラが最適化しない場合)。
はい、バイナリ サイズを増やしてから、RAM サイズを増やすことができます。2 つの方法があります: 1. ヘッド ファイルには、グローバル/静的変数の定義があります。ただし、コンパイラはそれらを最終的なバイナリに保持する場合があります。
「増加する可能性がある」と言ったのは、コンパイラが十分にスマートであれば、バイナリに必要なデータのみを含めることができ、その他は破棄できるためです。</p>
変数宣言、typedef などの他のコンテンツについては、実行時ではなくコンパイル時にのみ必要になるため、RAM は増加しません。
いいえ、インクルード ファイルはコンパイラ用です。生成されるコードのサイズにはまったく影響しません。
いいえ。インクルード ファイルは関数ではなく、システム関数への参照です (少なくともコンパイラに付属するものについては)。自分で確認したい場合include
は、コンパイラのディレクトリに移動し、テキスト エディタでファイルを開きます (ただし、絶対に変更しないでください)。.h
それらはあなたが書く他のものと同じです。関数は定義されていません。
コンパイラは、関数名 (例: printf) が有効であることを確認し、それをオブジェクト ファイルにコンパイルします。リンカーは、その名前を有効なシステム コールに変換します。
ヘッダーのインクルードは、コンパイル時にのみ有効です。それらは、必要な実装を見つけることができる場所をコンパイラーに伝えるために使用されます。
コンパイルされた実行可能ファイルはこれらの情報を保持しないため、インクルードの数の影響を受けません。
これは、ファイルをインクルードするとメモリ使用量が増加する可能性がある PHP のようなインタープリター言語との大きな違いです。しかし、PHPでもメモリ使用量を最小限に抑えるメカニズムがあります(ファイルを1回インクルードし、未使用のインクルードを除く...)
はい、ほんのわずかですが、CPU 使用率が増加します。Windowsタスクマネージャーで確認できます....