問題タブ [alloca]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - どの場合にalloca()は役に立ちますか?
すべての用途に対応するのに十分な大きさの固定サイズのバッファーをスタックに常に割り当てることができるのに、なぜalloca()を使用したいのでしょうか。これは修辞的な質問ではありません...
c - alloca は完全に置き換え可能ですか?
時代遅れで使用すべきではないかなりの数の場所を読みましたが、alloca
代わりに可変長配列を使用する必要があります。
私の質問はこれです:alloca
可変長配列で完全に置き換え可能ですか?
私の特定の例では、次のようなものがあります。
私は何かを見逃していますか、それともこれは alloca の実際の有効な使い方ですか? また、この例では、何らかの理由で値をスタックに割り当てたいと仮定します
c++ - alloca を使用し、それ以外は C++ STL に準拠しているアロケーターはありますか?
2 つの質問があります。
1) alloca を使用してスタックにメモリを割り当てるアロケータを実装することは可能ですか? それ以外は C++ STL に準拠していますか?
コードが公開されている場合は、その URL を教えていただければ幸いです。:-) そこにコードがない場合は、関数の割り当てと割り当て解除をスケッチできますか?
2) 上記の質問に対する答えが「はい」の場合、クラス メンバーのスタックにメモリを割り当てる方法を理解したいと思います。例として、
そして、このベクトルのメンバー関数「resize」の呼び出しが、最初に「deallocate」を呼び出し、次にアロケーターの「allocate」を呼び出すとします。
allocate が呼び出されるスコープは、メンバー関数 resize のスコープです。これは、割り当てられたメモリがその関数呼び出しの最後にスタックから削除されることを意味しませんか?
敬具、ビョルン
c - malloc またはスタックを使用する C sprintf 関数
のバージョンがあると聞いたことがありますsprintf()
。おそらく GNU/gcc 拡張機能で、必要な独自のバッファーを割り当てるかfree()
、おそらく のようなスタックを使用して動作しますalloca()
。
どちらの方法も私にとっては問題ありません。私が考えていた機能を誰か教えてもらえますか?
c++ - execvp()の実装でallocaを置き換える方法は?
ここのNetBSD実装を見てexecvp
ください:
処理の特別な場合の130行目のコメントに注意してくださいENOEXEC
。
この実装execvp
をスタンドアロンC++に移植しようとしています。 alloca
非標準なので避けたいです。(実際、私が欲しい関数はexecvpe
FreeBSDのものですが、これは問題をより明確に示しています。)
プレーンが使用された場合にメモリがリークする理由を理解していると思いますmalloc
-の呼び出し元はexecvp
親でコードを実行できますが、への内部呼び出しはexecve
決して返されないため、関数はポインタを解放できずmemp
、ポインタをに戻す方法はありません発信者。しかし、私は置き換える方法を考えることができませんalloca
-このメモリリークを回避するために必要な魔法のようです。C99は可変長配列を提供していると聞きましたが、最終的なターゲットはC ++であるため、残念ながら使用できません。
この使用を置き換えることは可能alloca
ですか?C ++ / POSIX内にとどまることが義務付けられている場合、このアルゴリズムを使用するときに避けられないメモリリークはありますか?
windows - スタックの成長はWindowsとLinuxでどのように機能しますか?
_alloca
スタックに4k以上が必要な場合、Windowsプログラムが関数エントリを呼び出してスタックを拡張することを読みました。ガードページがヒットするたびに、ウィンドウがスタックに新しいページを割り当てるため_alloca
、4kステップでスタックにアクセスしてスペースを割り当てます。
また、これはWindowsにのみ適用されることも読みました。Linux(または他のOS)は、必要がない場合、この問題をどのように解決します_alloca
か?
c - allocaを使用してC関数ポインターを割り当てる方法は?
Cはいつも謎です!
より高速なメモリ割り当てオプションとしてallocaを使用しようとしている作業員スレッド実行モデルを実装しています。allocaを使用してスタックに格納されている関数ポインターを介してコードを実行しようとすると、奇妙なセグメンテーション違反が発生します。
これは、同様のセグメンテーション違反を引き起こすつまようじコードです。
上記のコードを実行すると、tnew-> f()行でセグメンテーション違反が発生します。GDBバックトレースはあまり役に立ちませんでした。
上記のコードでエラーを説明してください。私は初めてallocaを使用しています。
どうもありがとうございます!
c - alloca ポインタを返す
このコードは、スタックに割り当てられた変数への無効な参照を返しますか? または何:
それとも、alloca の実装/コンパイラ サポートによって処理される特殊なケースf(alloca(size), alloca(size))
ですか?
c++ - allocaを使用して割り当てられたメモリは、クラスメンバー用にいつ解放されますか?
main関数の最後で解放されますか、それともコンストラクターが実行された直後に解放されますか?上記のコードが期待どおりに機能する場合は、このような文字列クラスを作成することをお勧めしますか?
アップデート:
主な危険は
- スタックオーバーフロー
- コンストラクターのインライン化
小さいサイズの場合はallocaを使用し、大きいサイズの場合はmalloc / freeを使用することで、StackOverflowを処理できると思います。コンパイラを強制的にインライン化するには、移植性のないコンパイラ固有の方法が必要だと思います。
文字列クラスはあらゆるc++プロジェクトで広く使用されているものなので、私は興味があります。これを正しく行うと、ほとんどの割り当てがスタック内に配置され、そうでない場合はヒープに入るので、パフォーマンスが大幅に向上することを期待しています。これはユーティリティであり、エンドユーザーは内部を認識しません。
portability - alloca(0)は何をし、さまざまなプラットフォームで戻りますか?
alloca()
指定されたサイズが0の場合、NULLを返しますか?
alloca(0)
すばやく検索すると、場合によってはガベージコレクションが強制されることがわかり ます。しかし、私は主に戻り値に興味があります。
ありがとう