質問 |
||
| 質問者: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 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |