私は現在、Cでスタック実装を書いています。可能な限り小さなメモリを使用し、可能な限り高速にする必要があります。私はこのためにvoidポインターを使うことにしました。そして、私の錆びたCにもかかわらず比較的速く動作しました。しかし実際にはそれを使うのはかなり醜いです。C:voidポインタを使用する一般的なデータ構造のためのより良い構文ですか?
スタックをテストするために、整数をループでプッシュします。実際にはintをvoidポインタとして渡すことが問題です。
for (int i = 0; i < 20; i++){
stack_push(s, &i); //s is the stack_t pointer
}
しかし精密検査でi
が破壊的に各ステップごとに更新されているので、これは明らかに、機能しません。
私の最初の傾きが&
を使用していました。スタック内のすべての要素は20
となります。
:
for (int i = 0; i < 20; i++){
int* p = malloc(sizeof(void*));
*p = i;
stack_push(s, p);
}
このはを動作しますが、二つの問題を提示:
それは私が心配する必要は醜い
ですスタックのすべての要素のメモリ管理について(そして何らかの理由で手動でスタックを歩いて、すべての要素を解放することは、まだメモリリーク...)
組合と不要なメモリを無駄にしてはまだ速いことなくこれを行うには良い方法はありますか?ありがとう。
スタックからアイテムをポップアップすると、どのように取り出したのかはどのようにわかりますか?各スタックには複数のタイプがありますが、ポインタだけではどのタイプのアイテムであるかを知ることはできません。 – Jon
スタックは何のために使用されますか?大まかに言えば、スタックはスタックポインタを下に移動するだけでメモリを解放することができます。しかし、スタックにヒープへのポインタが含まれていれば、それでもまだスタックを解放する必要があります。 – Douglas
あなたがここで何を求めているのか分かりません。あなたがプッシュするポインタは通常、単純な整数へのポインタではなく、いくつかの種類のオブジェクトへの有効なポインタです。呼び出し元がそれらのオブジェクトのメモリを管理する責任はありませんか?または、スタックの実装を検討している場合は、ポインタの上で責任を採用し、スタックが破壊された場合はフリーですか? –