- ベストアンサー
関数内の変数について
g++やgccで関数内で定義した変数をレジスタに割り当てる方法が知りたいです。 あと、関数内で定義した変数は、スタック上やヒープ上に作られると思いますが、この基準はどうなっているのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> g++やgccで関数内で定義した変数をレジスタに割り当てる方法が知りたいです。 次のようにします。 register int variable asm("レジスタ名"); > 関数内で定義した変数は、スタック上やヒープ上に作られると思いますが、この基準はどうなっているのでしょうか? GCCでもターゲットによって事情は異なりますが... 記憶クラス指定子がないか、autoまたはregisterを付けた場合、割付け可能なレジスタがあればレジスタに割付けられます。そうでなければスタックに割付けられます。ただし、volatile修飾子を伴う場合は、上記の場合でも必ずスタックに割付けられます。 ヒープに割付けられるのは、基本的にはmalloc, calloc, reallocで割付けた場合です(間接的にそれらの関数を呼び出すものも含む)。それ以外では、C++で、送出された例外オブジェクトがヒープに割付けられます。
その他の回答 (1)
- MrBan
- ベストアンサー率53% (331/615)
register int foo; などのように、registerと書くと *レジスタに割り当てられ易くなります*。 必ずレジスタに割り当たる保証はなく、 強制的にレジスタに割り当てる方法は言語としてはありません。 コンパイラの最適化能力次第です。 スタックとかヒープとかは環境依存/実装依存の話ですから、 これもコンパイラの実装次第ですが、 newやmallocなどで確保したものが一般にヒープに、 その他のものは一般にスタックにとられるといわれます。 # そもそも最適化で消えてしまう変数とかありますし、 # *コンパイラが最適化しやすい書き方* はあっても、 # 具体的な割り当てはコンパイラが良しなにやるものです。