2012-04-11 2 views
1

私は、次の表記法[512 + 1]

char a[512 + 1]; 
a[512] = '\0'; 

それは賢明ではない非効率的な、メモリの使用率ですを使用して、コードの多くを参照してください? 32ビットマシンを使用していると仮定します。そして、[512 + 1]は実際には[512 + 4]を意味します。
サーバアプリケーションではそれほど重要ではないかもしれませんが、組み込みシステムプログラミングにとっては重要です。

+0

これは基本的に、今日ではほとんど問題ではありません。 – Cray

+0

を参照してください:http://stackoverflow.com/questions/2215445/are-there-machines-where-sizeofchar-1 – thumbmunkeys

答えて

1

ここで余分なメモリは使用されていません。 513バイト(char)は、すべての実装で標準で1バイトであることが保証されています。パディングバイトは、配列の場合ではない構造の場合に追加されます。配列の場合は、何も求めなかったものが得られます。

構文は追加の目的で使用されていることに注意してください。可読性です。
文字列は512 charとなっており、末尾にはcharが必要です。\0。これは、アプリケーションでより読みやすいコードを書くためのものです。

+3

あなたはポイントを逃しています:Vivekの心配は、位置合わせの要件のために、パディングする必要があるでしょう'a'の終わりから次のオブジェクトまでのバイト数です。これは実際にほとんどのプラットフォームで起こります。 (特に、パディングバイトは配列の一部ではなく、それらにアクセスするのはUBですが)有効な問題です。 – Christoph

+0

'パディングバイトは、構造の場合には追加されません。配列 ' - CPUのloootsがスタックのために整列制限を持っていることを除いて。 IntelのCPUは、パフォーマンス上の理由から少なくとも8バイトのアライメントが必要です。通常は16です...つまり、これらのCPU用のコンパイラは、スタックが常に整列していることを確認します。 – Voo

0

NULL文字に対応するだけの安全性。

[512 + 1]は実際に[512 + 4]を意味します。

512+1メモリアラインメントの問題が心配しない限り、513となりますか?

まだあなたを幸せにしていない場合は、それ

char arr[511+1]; 
arr[sizeof(arr)-1]=0; 
+0

それはまさに彼が心配していることなので、これは質問に答えません。 – Lundin

+1

@ Lundinあなたが3バイトの安全性と節約を望むなら、それは困難です。ここでやったように、文字列の長さを1バイト減らす必要があります。 –

3
char bla[512]; 
bla[sizeof bla - 1] = '\0'; 

が私の意見では優れているします。

+0

文字列の長さが「512」の場合はどうなりますか? –

+1

@Als長さが '> 512' – ouah

0

私は確信が持てませんが、CPUの配置制限に依存するはずです。 MIPSのような一部のRISC CPUは、個々のバイトにアクセスしません。ロード命令を使用して4バイトのワードだけがアクセスされます。その場合、すべてのバイトは単語を取ります。私はそれが現実世界の状況の場合だとは思わない。私はコンパイラが連続した 'char'を単語に入れていると思う。 「マスキング」を使用して個々のバイトを取得します。

がダウンして実際に最もメモリ効率的なソリューションである総オブジェクトサイズにアーキテクチャの基本的なアラインメントの倍数を作り、まだ:)非常に「自信がない」と答え:)

1

を投票しません。

オブジェクトのサイズとして2の累乗を選択すると、割り当てられたオブジェクトの断片化を避けることができますが、それはlibcアロケータの実装に依存します。

主流のアーキテクチャでは、特定の例はめったに問題ではありませんが、関連するものがあります。構造体のパディングと、コンパイラが自由にメンバーを並べ替えることができないという追加の警告があります。

+0

と最後に関連するコメントと同じこと – Aftnix

1

まず第一に、どのCPUが使用されているかに依存するため、質問は詳細には広すぎます。

しかし、組み込みシステムプログラミングの場合は重要です。

すべての準近代エンベデッドMCU/MPUは、ミスアライメントされたアクセスをサポートする可能性があり、32ビットより小さいロード命令をサポートする可能性があります。より小さい8/16ビットの最新のMCUは、アラインメントの問題がない可能性が最も高いでしょう。

ミスアライメントされたデータを読み取ることができないCPUに遭遇した場合、何ができるのですか?奇数バイトを割り当てる方法はありません。

0

スケールによって異なります。あなたはこれらの10を持っている場合、誰が気に? 100万人がいれば?それでは、既に512MBのデータがあるので、3MBの無駄が本当の問題になるとは思わない。

100万のオブジェクトを割り当てる必要があるため、割り当て制御構造には3MBを超えるものが必要です。割り当ての最適化にはより意味があります。単一オブジェクトの代わりに大きな配列を割り当てます。または、文字列を大きな文字配列に格納することで、長さ127の文字列は完全な513ではなく128バイトだけを使用し、ずっと多くを無駄にします。また、各文字列を圧縮形式で保存することもできます。

完全な512バイトが必要な場合は、 '\ 0'を終了せずに文字列を保存し、これに注意を払うラッパー関数だけでアクセスできます。

これらのソリューションはすべて、エラーが発生しやすく、最後のように特別な注意が必要な余分な作業を意味することに注意してください。したがって、大量にスケーラビリティが必要であり、そのメモリがボトルネックになる可能性があります。そうしないと、読みやすさと保守性に影響を与えずに、早急に最適化を行うことができます。