11

2 つの質問があります。

1) alloca を使用してスタックにメモリを割り当てるアロケータを実装することは可能ですか? それ以外は C++ STL に準拠していますか?

コードが公開されている場合は、その URL を教えていただければ幸いです。:-) そこにコードがない場合は、関数の割り当てと割り当て解除をスケッチできますか?

2) 上記の質問に対する答えが「はい」の場合、クラス メンバーのスタックにメモリを割り当てる方法を理解したいと思います。例として、

std::vector<int, AllocaAllocator<int> > 

そして、このベクトルのメンバー関数「resize」の呼び出しが、最初に「deallocate」を呼び出し、次にアロケーターの「allocate」を呼び出すとします。

allocate が呼び出されるスコープは、メンバー関数 resize のスコープです。これは、割り当てられたメモリがその関数呼び出しの最後にスタックから削除されることを意味しませんか?

敬具、ビョルン

4

2 に答える 2

6

Bjoern、スタックとアロカがどのように機能するかを根本的に誤解しているようです。それらについて読んでください。

allocaによって割り当てられたメモリは、それを割り当てた関数から戻るときに「解放」されるため、要求していることは不可能です(Patrickが言ったのとは異なり、インライン化はその動作を変更できません)。「freed」と書くのは、実際には解放されていないためです。他のスタック変数と同じようにスコープから外れるだけです。したがって、後でそれを使用すると、未定義の動作が発生します。

YourAllocator::allocateから呼び出されるメモリのチャンクを割り当てるとしd.push_back()ます。

deque<int, AllocaAllocator> d;
d.push_back(42); // calls alloca
printf("Hello\n");
printf("%d\n", d[0]);

allocaによって割り当てられたメモリは、push_backとのスタックフレームによって上書きされる可能性がprintfあるため、出力が42でない場合や、クラッシュする場合などがあります。

于 2010-11-26T17:55:55.973 に答える
3

いいえ、このようなことはできません。まず、STL はより多くのメモリを割り当て、次に古いメモリを解放することを想定しています。スタックでそれをどのように行うのですか?

これとリモートで同等であっても、保守的なガベージ コレクターだけです。

于 2010-12-14T20:12:29.740 に答える