2

ファイルにいくつかのバイナリ データがあり、そのファイルを のメモリにロードしますchar* data。これで、たとえば、オフセット 123 で が始まることがわかりましたstruct something

次のことをしても安全ですか

(struct something*) (data + 123) // ??&data [123]??

次に、構造体のメンバーにアクセスします。または、次のようなことをする必要があります

struct something record;
memcpy (&record, data + 123, sizeof (struct something) );

それともまったく違うものですか?

「メモリの配置」、「単語の境界」などについて曖昧な記憶があるため、私の質問は主に動機付けられています...

4

2 に答える 2

6

はい、memcpyまさにあなたが議論する理由であるアライメントのために、ポインター変換ではなく を使用する必要があります。ポインターの変換は安全ではありません。アラインメントが間違っている場合、結果のポインターを使用したときの動作は C 標準によって保証されません。

状況によっては、データをオブジェクトに直接読み込む方法もあります。

于 2014-01-28T01:44:49.137 に答える
0

場合によります。

一部の最新の CPU (x86 など) では、読み取り/書き込み操作でアライメントされていないワードにアクセスしても問題なく、パフォーマンスの低下はありませんが、一部の特定の命令ではアライメントされたオペランドが必要になる場合があります (PPC の CAS 命令など)。

于 2014-01-28T01:51:08.427 に答える