ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:tobasu 関数内の変数について
困り度:
  • 困っています
g++やgccで関数内で定義した変数をレジスタに割り当てる方法が知りたいです。

あと、関数内で定義した変数は、スタック上やヒープ上に作られると思いますが、この基準はどうなっているのでしょうか?
質問投稿日時:08/05/04 13:15
質問番号:3996677
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:jacta > g++やgccで関数内で定義した変数をレジスタに割り当てる方法が知りたいです。

次のようにします。

register int variable asm("レジスタ名");

> 関数内で定義した変数は、スタック上やヒープ上に作られると思いますが、この基準はどうなっているのでしょうか?

GCCでもターゲットによって事情は異なりますが...

記憶クラス指定子がないか、autoまたはregisterを付けた場合、割付け可能なレジスタがあればレジスタに割付けられます。そうでなければスタックに割付けられます。ただし、volatile修飾子を伴う場合は、上記の場合でも必ずスタックに割付けられます。

ヒープに割付けられるのは、基本的にはmalloc, calloc, reallocで割付けた場合です(間接的にそれらの関数を呼び出すものも含む)。それ以外では、C++で、送出された例外オブジェクトがヒープに割付けられます。
種類:回答
どんな人:専門家
自信:参考意見
回答日時:08/05/04 13:37
回答番号:No.2
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答10pt

回答者:MrBan register int foo;
などのように、registerと書くと *レジスタに割り当てられ易くなります*。
必ずレジスタに割り当たる保証はなく、
強制的にレジスタに割り当てる方法は言語としてはありません。
コンパイラの最適化能力次第です。

スタックとかヒープとかは環境依存/実装依存の話ですから、
これもコンパイラの実装次第ですが、
newやmallocなどで確保したものが一般にヒープに、
その他のものは一般にスタックにとられるといわれます。
# そもそも最適化で消えてしまう変数とかありますし、
# *コンパイラが最適化しやすい書き方* はあっても、
# 具体的な割り当てはコンパイラが良しなにやるものです。
種類:補足要求
どんな人:専門家
自信:参考意見
回答日時:08/05/04 13:29
回答番号:No.1
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示