2

(注uint8unsigned char)のようなメモリ領域を定義したと考えてみましょう。

uint8 myMemoryArea[1024];

そして、私は次のような構造体を持っています:

typedef struct
{
   uint8 * ptrToMyVar; 
   uint8 otherVar;
} myStruct_type;

myMemoryAreaの配列であると見なしたいmyStruct_typeので、たとえば次のように、メモリ領域へのランダムアクセスを実行したいと思います。

myStruct_type * myPtrToStruct = (* myStruct_type)(&(myMemoryArea[ELEMENT_TO_ACCESS * sizeof(myStruct_type)]));
myPtrToStruct->otherVar =  2;

このマシンは独立したコードですか?位置合わせやパディングで問題が発生する可能性がありますか?を使用している限り、ここではパディングは問題ないと思いますsizeof

myMemoryAreaそれがで割り切れるアドレスから始まることを確認する必要がありますsizeof(* char)-おそらくそれをポインタの配列として定義しますか?

4

1 に答える 1

2

myMemoryArea適切に調整される保証はありません。CPU、O / S、およびコンパイラによっては、クラッシュしたり、位置がずれたデータへのアクセスが非常に遅くなったりする場合があります。(参照:私を困惑させたCインタビューの質問のメモリアラインメントを解決してください)。

変数がこのコンテキストで宣言された場合に何が起こるかを考えてみましょう。

double d1;
uint8  c1;
uint8  myMemoryArea[1024];
uint8  c2;
douebl d2;

d1適切に調整されることを期待する理由はすべてあります。そうでない場合、コンパイラは恐ろしく失敗します。c1;の異常な治療を期待する理由はありません。1バイトは任意のアライメントに格納できます。また、myMemoryAreaデータを特別に調整する必要はありません。その周りにスペースがない可能性があり、奇妙なアドレスにある可能性があります。c2変数は特別な処理を必要としません。d2適切に配置されます(データには6バイトの未使用スペースがある可能性があります。

myMemoryArea奇数バイトのアラインメントであり、RISCマシンを使用してメモリ構造にアクセスする場合、SIGBUSエラーが発生する可能性があります。Intelマシンでは、代わりにアクセスが非常に遅くなる場合があります。

于 2013-03-27T10:21:05.187 に答える