を完全に避けることについてはわかりませんがmalloc
、確実に減らすことができます。
基本的な概念はメモリ プールです。これは、多数の小さな割り当てを要求する代わりに、多くのオブジェクトに使用できる割り当て済みの大きなバッファーです。
これは、イベントをキューに送信して別のスレッドで処理するという実際の状況で使用できます。malloc
イベント オブジェクトは小さな構造である可能性があり、毎秒何千回も呼び出しを行うことは避ける必要があります。
もちろん、答えはこれらのイベント オブジェクトをプールから引き出すことです。必要に応じて、プール バッファーの一部を使用してリストを作成し、プールに返されたメモリのインデックスをすばやく作成することもできます。これらは一般にフリーリストとして知られています。
データのアライメントがずれているとパフォーマンスに深刻な影響を与える可能性があるため、メモリのアライメントには注意する必要があります。しかし、ちょっとした計算ですべてを処理できます。
これらの概念に惑わされないでください。プールは実際にはそれほど洗練されている必要はありません。このことを考慮:
int ** matrix = malloc( rows * sizeof(int*) );
for( int i = 0; i < rows; i++ ) {
matrix[i] = malloc( cols * sizeof(int) );
}
私はこれをいつも見ていて、それは私のペットピーブです. これができるのに、なぜそれをするのですか:
int ** matrix = malloc( rows * sizeof(int*) );
matrix[0] = malloc( rows * cols * sizeof(int) );
for( int i = 1; i < rows; i++ ) {
matrix[i] = matrix[i-1] + cols;
}
そしてもちろん、それはこれに還元されます(ただし、最初の行の潜在的なアライメントの問題に注意してください-明確にするために、ここでは無視しました)
int ** matrix = malloc( rows * sizeof(int*) + rows * cols * sizeof(int) );
matrix[0] = (int*)matrix + rows;
for( int i = 1; i < rows; i++ ) {
matrix[i] = matrix[i-1] + cols;
}
最後の例の素晴らしい点は、行列を簡単に削除できることです =)
free( matrix );
ああ、行列をゼロにするのも同じくらい簡単です...
memset( matrix[0], 0, rows * cols * sizeof(int) );