0

ubuntu 12.04 と Qt Creator 2.4.1 を使用しています。デフォルトで C コードをビルドしますGCC

私は自分のプログラム ( Qt Creator (uses GDB)) をデバッグしていますが、プログラムの後のステップで呼び出される/作成される多くの変数を既に確認できます。プログラムの最初にすべての変数が表示されるのは正常ですか? -gつまり、デバッグ オプション ( )のおかげで、プログラムの初期段階で変数が表示されるのでしょうか。たとえば、コードに「ステップイン」し、最初のステップで停止します。int main() 忙しい猫

char[1000] mesg;129行目で実行されますが、それとそのメモリアドレスはすでに確認できます。またはint tem_hopt_dist=0;230 行にありますが、その値は既に「3」と表示されています。

4

2 に答える 2

4

static「静的期間」を持つ変数 (キーワードと同じものではありませんが、宣言された変数にはstatic通常静的期間があります) は、実行モデルでmainは、呼び出されるまでに「作成」されます。「自動期間」(「スタック上」、多くの人が呼ぶように) を持つ変数は、スコープに入るまでに作成されます。明示的にd (またはスペースが などによって削減される)mallocまで lastを介して割り当てられた変数。freerealloc

上記の重要なポイントは、「この時点で作成されるではなく、「この時点までに」です。それがより効率的であれば、コンパイラーはそれを以前に自由に行うことができます。ブロック スコープの自動期間変数の場合、一般的に、それらすべてを 1 つの大きなエントリ ポイント スタック割り当てにまとめるのが最も安価です。現代の機械。スペースの解放は、完全に解放されるか (「関数から戻る」で実行されます)、または 1 つの命令だけで済みます (「スタック ポインターに定数を追加する」)。

C99 の可変長配列 (「VLA」) は、これを少し複雑にします。多くの場合、VLA は、囲んでいるブロックに入るたびに割り当て、ブロックから出るたびに解放する必要があります。繰り返しますが、これは一般にかなり安価です (VLA を作成するためにスタック ポインターから 1 つ減算し、VLA を破棄するために 1 つ加算します)、ブロックごとに 2 つの命令は、ブロックごとにゼロ命令よりも明らかにコストがかかります。これはまた、一部のコンパイル時の最適化をわずかに妨げます。

非標準alloca関数を使用する場合、これも通常、スタック ポインターからの減算によって実装されます。VLA では「うまく機能しない」可能性があります。 from stack pointer" を、関数自体が開始される直前に 1 回だけ実行します。

于 2012-06-16T18:10:33.220 に答える
2

はい、これは正常です。デバッガーは、言語のすべてのスコープ セマンティクスを理解するわけではなく、すべての変数がスコープ外であっても、最終的なメモリ位置で初期化されたかのようにデータを表示します。

一部のデバッガーは他のデバッガーよりも優れています。これは、たとえば、別々のインデックス変数をすべて呼び出して使用する習慣がiあり、デバッガーがそれらを区別しない場合など、頻繁にイライラする原因となります。

于 2012-06-16T17:54:15.350 に答える