gpt4 book ai didi

c++ - 如何正确访问打包结构成员

转载 作者:行者123 更新时间:2023-12-03 08:10:31 24 4
gpt4 key购买 nike

访问打包结构成员的正确方法是什么?

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 之间,一种方法比另一种更好吗?
  • 访问未对齐的指针数据是否不正确,但可以使用它来初始化正确对齐的类型? (如酒吧)。
  • 我们是否应该将打包结构的各个成员复制到正确对齐的数据结构中,然后使用它?这意味着几乎每个打包数据结构都有一个非打包数据结构,而打包结构仍然局限于序列化层。

最佳答案

目前,调用g 可能会假设x 已对齐。这在 x86 架构上可能没问题,但 foo 在 ARM 上可能会崩溃。

像在 bar 中那样调用它并不比 g 采用 int x 好多少。但是,它是正确的,因为编译器知道 m.i 未对齐,因此可以生成代码来复制未对齐的 int。这确实意味着指针无法修改原始对象(除非您重新分配它)。

您还可以使用未对齐整数的类型:

typedef int __attribute__((aligned(1))) packed_int;
void g(packed_int * x); // do something with x

这可以直接调用为g(&m.i)。请注意,它无法执行对齐访问,从而导致某些平台上的速度变慢。

关于c++ - 如何正确访问打包结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70980038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com