パックされた構造体のメンバーにアクセスする正しい方法は何ですか?
struct __attribute__ ((packed)) MyData {
char ch;
int i;
}
void g(int *x); // do something with x
void foo(MyData m) {
g(&m.i);
}
void bar(MyData m) {
int x = m.i;
g(&x);
}
私の IDE は、foo に対して、整列されていない int ポインターにアクセスしている可能性があるという警告/提案を出します。私の質問は
- foo と bar の間で、一方のアプローチが他方よりも優れていますか?
- 位置合わせされていないポインター データにアクセスするのは正しくありませんが、それを使用して適切に位置合わせされた型を初期化しても問題ありませんか? (バーのように)。
- パックされた構造体の個々のメンバーを適切に配置されたデータ構造にコピーしてから使用する必要がありますか? これは、ほぼすべてのパックされたデータ構造に対して、パックされていないデータ構造があり、パックされた構造はシリアル化レイヤーに限定されたままであることを意味します。