次の表記を使用して、多くのコードが表示されます
char a[512 + 1];
a[512] = '\0';
それは非効率的ではありませんか、メモリ使用率は賢明ですか?32ビットマシンを使用していると仮定します。そして、[512+1]は実際には[512+4]を意味します。
サーバーアプリケーションにとっては大したことではないかもしれませんが、組み込みシステムプログラミングにとっては重要です。
次の表記を使用して、多くのコードが表示されます
char a[512 + 1];
a[512] = '\0';
それは非効率的ではありませんか、メモリ使用率は賢明ですか?32ビットマシンを使用していると仮定します。そして、[512+1]は実際には[512+4]を意味します。
サーバーアプリケーションにとっては大したことではないかもしれませんが、組み込みシステムプログラミングにとっては重要です。
char bla[512];
bla[sizeof bla - 1] = '\0';
私の意見ではより良いです。
ここで使用されている余分なメモリはありません。すべての実装でバイトであることが標準で保証されているように、これは513
バイトです。配列の場合ではなく、構造の場合にパディングバイトが追加されます。アレイの場合、あなたはそれ以上何も求めていないものを手に入れます。 char
1
構文は追加の目的を果たすことに注意してください。より読みやすくなります。これは、文字列がcharであると想定されており、終了するために追加が必要である
ことを明確に示しています。責任は、アプリケーションでより読みやすいコードを書くことにあります。512
char
\0
オブジェクトの合計サイズをアーキテクチャの基本的な調整の倍数にすることは、実際に最もメモリ効率の高いソリューションです。
さらに、オブジェクト サイズとして 2 の累乗を選択すると、割り当てられたオブジェクトの断片化を回避できる可能性がありますが、これは libc アロケーターの実装に依存します。
主流のアーキテクチャでは、特定の例が問題になることはめったにありませんが、関連するものがあります。構造のパディングです。コンパイラがメンバーを自由に並べ替えることができないという追加の警告があります。
まず第一に、質問は広すぎて詳細に答えることができません。これは、使用されている CPU に依存するためです。
しかし、組み込みシステム プログラミングの場合は重要です。
すべてのセミモダンな組み込み MCU/MPU は、ミスアライン アクセスをサポートする可能性が高く、32 ビットよりも小さいロード命令をサポートする可能性があります。より小さな 8/16 ビットの最新の MCU には、ほとんどの場合、アライメントの問題はまったくありません。
位置合わせされていないデータを読み取れない CPU に出くわした場合、どうすればよいでしょうか。奇数のバイトを割り当てる方法はありません。
キャラクターを収容するためのそのちょうど余分な安全NULL
。
そして、[512+1]は実際には[512+4]を意味します。
512+1
513
メモリアライメントの問題を心配しない限り、そうなるでしょうか?
それでもあなたが幸せでないならそれを作ってください
char arr[511+1];
arr[sizeof(arr)-1]=0;
スケールにもよります。これらが10個ある場合、誰が気にしますか?100万あれば?すると、すでに 512MB のデータがあるので、無駄な 3MB が実際の問題になるとは思いません。
100 万個のオブジェクトを割り当てる必要があるため、割り当て制御構造には 3MB をはるかに超える容量が必要になります。単一のオブジェクトの代わりに大きな配列を割り当てるなど、割り当てを最適化する方が理にかなっています。または、バイト単位のストレージを使用して文字列を大きな char 配列に格納すると、長さ 127 の文字列は 513 バイト全体ではなく 128 バイトしか使用せず、はるかに多くの無駄になります。または、各文字列を圧縮形式で保存することもできます。
完全な 512 バイトが必要な場合は、'\0' を終了せずに文字列を保存し、これを処理するラッパー関数によってのみアクセスすることもできます。
これらのソリューションはすべて、最後のソリューションのように、エラーが発生しやすく、特別な注意が必要な余分な作業を意味することに注意してください。したがって、大きな数へのスケーラビリティが必要であり、そのメモリがボトルネックになることを確認してください。そうしないと、最適化を必要とせずに、読みやすさと保守性にすべての影響を与える時期尚早な最適化を行う可能性があります。
よくわかりませんが、CPUのアライメント制限に依存するはずです。MIPS などの一部の RISC CPU は、個々のバイトにアクセスしません。ロード命令を使用してアクセスできるのは 4 バイト ワードだけです。その場合、すべてのバイトが 1 ワードを占めます。現実世界の状況ではそうではないと思います。コンパイラが連続した「文字」を単語に入れていると思われます。次に、「マスキング」を使用して個々のバイトを取得します。
まだ反対票を投じないでください:)非常に「自信がない」答え:)