グローバル変数は、デフォルトで "0"に初期化されます。グローバル変数初期化の最適化
私は明示的に値を代入するとき、それはそれに「0」(もしあれば)どのくらいの違いを生むん。
これらのいずれかの高速化/改善/最適化はありますか?
私は小さなサンプルの.cプログラムを試しましたが、実行可能ファイルのサイズに変更はありません。
編集:0私は行動を理解したいです。それは決して私にとってボトルネックではありません。
グローバル変数は、デフォルトで "0"に初期化されます。グローバル変数初期化の最適化
私は明示的に値を代入するとき、それはそれに「0」(もしあれば)どのくらいの違いを生むん。
これらのいずれかの高速化/改善/最適化はありますか?
私は小さなサンプルの.cプログラムを試しましたが、実行可能ファイルのサイズに変更はありません。
編集:0私は行動を理解したいです。それは決して私にとってボトルネックではありません。
あなたの質問への答えは、特定の非常に実装したものですが、一般的にすべて初期化されていないグローバル変数と静的変数は.bssセグメントで終わります。明示的に初期化された変数は他にもあります。data segmentこれらの両方は、main()
の実行前にプログラムローダーによってコピーされます。したがって、明示的にゼロに初期化し、変数を初期化しないままにすることには、パフォーマンスの違いはありません。
、それは明らかにゼロに初期値が期待されていることになりようIMOには、明示的にゼロにグローバルおよび静的に初期化することをお勧めします。
詳細な回答をいただきありがとうございます。 – hari
.bssとデータセグメントはどのように検査できますか?そこに何が見える? – hari
@hariリンカにマップファイルを生成させるように指示します。このファイルには、さまざまなセクションがリストされます – Praetorian
私は私はあなたのプログラムがそのようにボトルネックがそれであることに最適化されているという事実について多くの疑問を持っている、があっても、差がある疑いが、。
私はむしろ程度ですべての問題のすべてのこの種のを気にして好きなように、おそらく唯一の最後の問題として最適化を残して、読みやすさへの道ではなく、スピードを与え、コードを書くことではないことをお勧めしたいです。
時期尚早の最適化は、あなたが最適化されたと言うとき、私はあなたがより速く実行中の意味と仮定していますすべての悪
のルートです。そうであれば、違いはありません。また、コンパイラは、グローバル変数の初期化を削除することさえあります(コンパイラの内部では不明です)。そして、あなたがプログラムのスペース利用率を意味するなら、それにも違いはありません。
ビガー質問は、しかしです - あなたはグローバル変数の初期化を経由して最適化することが見えるようにしようとしている具体的な理由があります。もう少し説明してください。
ありません。オプティマイザはこれをノーオペレーションとみなします。
明示的な初期化は、訓練されていない目ではより冗長で明確です。あなたのチームにジュニアがいる場合は、明示的にこれらの変数を初期化します。
明示的な初期化子がない静的オブジェクトは、起動時にゼロに初期化されます。オブジェクトを0
に明示的に初期化するかどうかは、通常、コンパイラが通常0のオブジェクトをすべて初期化して、main
より前になるため、パフォーマンスの点で違いはありません。一方
// File scope
// Same code is likely to be generated for the two objects initialization
int bla1;
int bla2 = 0;
あなたの代わりに初期化する0
を割り当てた場合、コンパイラは、オブジェクトの前の値だったか推測することができなかったので、それは違いを作ることができます。
void init(void)
{
bla1 = 0;
bla2 = 0;
}
これは自分自身には関係ないマイクロ最適化です。目立った変化はありません。 – JaredPar
2つの実行ファイル間でdiffを実行すると、それらが完全に同じであることがわかります。 –