2016-03-30 7 views
5

は、私は次のような構造のコードを持っている:私はスタックサイズが印刷されていることがわかり関数がインラインで停止します。説明は?

void foo1(uint32_t *num_failures) 
{ 
    ... 
    (*num_failures)++; 
} 

そして突然:今

void foo1(uint32_t *num_failures) 
{ 
    ... 
} 

void foo2(uint32_t *num_failures) 
{ 
    ... 
} 

void foo3(uint32_t *num_failures) 
{ 
    ... 
} 

void test() 
{ 
    uint32_t num_failures = 0; 
    foo1(&num_failures); 
    foo2(&num_failures); 
    foo3(&num_failures); 
} 

を、私がやったことはfoo1は()に次の命令を追加しました内部からfoo2()は36バイトだけ大きくなります。

私はobjdumpはしなかったし、<シンボル>ためgreped。

変更前:変更後

... 
00004e08 <test>: 

次降伏

... 
00004e08 <foo2>: 
00005588 <test>: 

をだから私は、関数foo2はインラインなくなっ思います。私は修正

  1. アム?
  2. その理由は何ですか?
  3. 変更後にfoo3()に何が起こりましたか?それは、とfoo2()内部またはテスト()内にインラインになりましたか?

必要かどうかわからない:私はアークプロセッサのためのgccを使用しています。

+0

おかげゆうが、それは間違っていた知りませんでした。 –

+0

推測:(* num_failures)アクセスにはローカル変数が必要です。 'test()'で使用可能なレジスタまたはスタックサイズの数が超えられたため、コンパイラはfoo2()という次の使用可能なポイントでコンパイラを分割します。 –

+1

私はインラインがコンパイラのヒントを無視して選択するかもしれないと思います。 – Ant

答えて

1

テーマにいくつかのより多くの学習、そしてチャンドラーCaruthによっていくつかの講義を見た後、私は、コンパイラはほとんどindeterministiclyコードをインライン展開する場所を決めると言うでしょう。私の場合のように、特にインラインのヒントを与えないと、特にそうです。

関連する問題