2016-08-28 6 views
0

Cメモリアライメントや用語の意味(データ構造のアラインメント)を理解しようとすると、アライメントエラーが発生します。私がこれについて学んだ最初の理由は、ネットワーク上で受信したバイナリデータを読み取るデータ解析コードを書いていることです。データにはいくつかのuint32s、uint64s、float、およびdoublesが含まれています。これらのコードが解析コードのエラーのために破損していないことを確認したいと思います。macbook pro(Intel 64ビットプロセッサ)のCでのメモリミスアライメントエラーを示す方法

によるミスアライメントにいくつかの問題を引き起こしで失敗した試行:私のマシン上で

uint32_t integer = 1027; 
uint8_t * pointer = (uint8_t *)&integer; 
uint8_t * bytes = malloc(5); 
bytes[0] = 23; // extra byte to misalign uint32_t data 
bytes[1] = pointer[0]; 
bytes[2] = pointer[1]; 
bytes[3] = pointer[2]; 
bytes[4] = pointer[3]; 
uint32_t integer2 = *(uint32_t *)(bytes + 1); 
printf("integer: %u\ninteger2: %u\n", integer, integer2); 

両方の整数が同じをプリントアウト。 (Intel 64ビットプロセッサを搭載したMacBook Proで、アラインメントの振る舞いを正確に判断するものは、アーキテクチャーなのか正確なCPUモデルか、コンパイラなのでしょうか)。

私のプロセッサ/マシン/アライメントのとれていない読み込みのため、問題なく上記のコードが必要です。

uint32_tの解析がアカウントでアラインメントを取らないコードのために失敗するケースはどうでしょうか?最新のインテル64ビット・システムでそれを失敗させる方法はありますか?または、整数や浮動小数点数(構造体なし)のような単純なデータ型を使用するとき、整列エラーから安全ですか?

編集:誰もが、後でこれを読んでいる場合は、私は興味深い情報と似た質問が見つかりました:Mis-aligned pointers on x86

+7

x86に合わせる必要はありません。パフォーマンスに役立ちますが、必須ではありません。 –

+0

私はバイト配列とuint32sの周りにuint64sを倍精度浮動小数点数を投げることができますし、決して破損したことはありませんか? –

+0

これは特に特定の質問ではありません。私が言ったように、エラーの原因となるデータ型のアライメントが行われる限り、あなたができることは何もありません。 –

答えて

1

通常、x86アーキテクチャは、[)movdqaのようないくつかのSIMD命令を除き、アライメント要件はありません。しかし

、あなたはは、このような例外が発生するコードを記述するためにをしようとしているので、...

フラグが登録したx86に設定することができアライメントチェック例外ビットがあります。あなたがオンにすると、アラインされていないアクセスが例外を生成し、バスエラー(つまり、SIGBUS)として表示されます。

詳細は、any way to stop unaligned access from c++ standard library on x86_64?を参照してください。例外。

関連する問題