この質問はSOでかなりフリーズしたレセプションを得たので、そこで削除して代わりにここで試すことにしました。ここにも当てはまらないと思われる場合は、少なくとも私が求めている例を見つける方法の提案についてコメントを残してください...
C99 VLAを使用することで、現在の標準ヒープを使用するC ++ RAIIメカニズムなどよりも優れた例を挙げていただけますか?
私が後の例は次のとおりです:
- ヒープを使用するよりも簡単に測定できる(おそらく10%)パフォーマンスの利点を実現します。
- アレイ全体をまったく必要としない、適切な回避策はありません。
- 実際には、最大サイズを固定する代わりに、動的サイズを使用するメリットがあります。
- 通常の使用シナリオでスタックオーバーフローが発生することはほとんどありません。
- C ++プロジェクトにC99ソースファイルを含めるためのパフォーマンスを必要とする開発者を誘惑するのに十分な強さである。
文脈上のいくつかの明確化を追加:C99の意味と、標準C ++に含まれていないように私は、VLAを意味:int array[n]
どこn
変数です。そして、私はそれが他の標準(C90、C ++ 11)によって提供される代替手段に勝るユースケースの例の後にいます:
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
いくつかのアイデア:
- varargsを取る関数は、当然ながらアイテム数を適切なものに制限しますが、APIレベルの上限はありません。
- スタックの浪費が望ましくない再帰関数
- ヒープのオーバーヘッドが悪いであろう多くの小さな割り当てと解放。
- 多次元配列(任意のサイズの行列など)の処理。パフォーマンスが重要であり、小さな関数は多くのインライン化が期待されます。
- コメントより:ヒープ割り当てに同期オーバーヘッドがある並行アルゴリズム。
Wikipediaには、私の基準を満たさない例があります。これは、ヒープを使用することの実際的な違いは、少なくともコンテキストがないと無関係であるように見えるためです。コンテキストがなければ、アイテム数がスタックオーバーフローを引き起こす可能性が非常に高いため、これも理想的ではありません。
注:私は具体的にはサンプルコード、またはこの例を自分で実装するためにこれから利益を得るアルゴリズムの提案を求めています。
alloca
ではないものでも、基本的に同じものだと思います)。しかし、マルチスレッド化されたものは良いので、質問を編集してそれを含めます!
malloc
動作がC標準に準拠しているかどうかは議論の余地があります。
alloca()
本当に優れmalloc()
ています。しかし、小さな配列は固定サイズを使用するだけで十分であり、大きな配列にはおそらくヒープが必要になるため、これは実際の拡張です。