【发布时间】:2022-02-04 12:33:07
【问题描述】:
访问打包结构成员的正确方法是什么?
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 之间,一种方法比另一种更好吗?
- 访问未对齐的指针数据是否不正确,但可以使用它来初始化正确对齐的类型? (如酒吧)。
- 我们是否应该将打包结构的各个成员复制到正确对齐的数据结构中,然后使用它?这意味着几乎每个打包数据结构都有一个非打包数据结构,而打包结构仍然局限于序列化层。
【问题讨论】:
-
编译器可能会使用各种花哨的技巧来实现
int x = m.i;行。也许它只访问i成员作为char的数组,并从中构建int? -
是的,编译器当然可以在这里使用 memcpy,这是正确的做法。但我的问题不同。
-
我真的不明白你的最后一个要点。为什么要创建一个全新的(非打包的)结构,只是为了访问打包版本的一个成员?
-
使用一个成员只是一个例子。如果一个结构有 10 个成员,那么结构的任何成员都可能出现访问不对齐的问题。
标签: c++ serialization alignment packed