覚えておくべき概念は、プロセッサーの効率を最大限に高めるために、コンパイラーは型に基づいてアクセスを最適化しようとするということです。そのため、int にアクセスするときはldr
、アラインされていないアクセスの場合にエラーになる命令などを使用する必要があります。アクセスにリンクするものについてchar
は、コンパイラが詳細の一部を処理します。あなたが心配しなければならないのは、次のようなものです。
ポインターのキャスト。char *
aを anにキャストしint *
、ポインターが正しく配置されていない場合は、配置トラップが発生します。一般に、( anint
から a にchar
) キャスト ダウンしても問題ありませんが、その逆は問題ありません。あなたはこれをしたくないでしょう:
char buf[] = "12345678";
int *p = &buf[1];
printf("0x%08X\n", *p); // *p is badness here!
構造体を使用してワイヤーからデータを引き出そうとしています。私はこれが多く行われているのを見てきましたが、それは単なる悪い習慣です。エンディアンの問題はさておき、要素がプラットフォームに対して正しく配置されていない場合、配置トラップが発生する可能性があります。
FWIW、ポインターのキャストは、おそらく私が実際に見た最大の問題です。
Write Portable Codeという素晴らしい本があり、複数のプラットフォーム用のコードを書くことについてかなり詳細に説明されています。リンクされたサイトのサンプルの章には、実際には配置について説明しているセクションが含まれています。
もう少し進行中のこともあります。のようなメモリ関数は、malloc
アラインされたブロック (通常はダブルワード境界) を返すので、データを書き込んでもアラインメント フォールトにヒットすることはありません。
最後に、新しい ARM はアラインされていないアクセスにうまく対処できますが、パフォーマンスが高いというわけではありません。それは彼らが寛容であることを意味します。X86 プロセッサについても同じことが言えます。それらはアライメントされていないアクセスを行いますが、そうすることで余分なメモリ フェッチを強制しています。