【问题标题】:address of a reference of packed member is not equal to address of packed member? [duplicate]打包成员的引用地址不等于打包成员的地址? [复制]
【发布时间】:2020-01-16 15:28:13
【问题描述】:

我用 g++ 编译了这个程序。它打印出“不平等”。
如果我不使用“packed”属性,它会打印“equal”。
我不知道“打包”属性是如何导致差异的。

顺便说一句, 由 clang++ 构建的可执行文件打印“equal”。

#include <iostream>

struct __attribute__ ((packed)) Packed {
  char a;
  int b;
  int c;
  char d;
};

void test(const int &i, int *ptr) {
  std::cout << ((&i == ptr) ? "equal" : "unequal") << std::endl;
}

int main () {
  Packed p;
  p.c = 1;
  test(p.c, &p.c);
  return 0;
}

【问题讨论】:

  • __attribute__((packed)) 变量属性 它指定成员字段具有最小可能的对齐方式。也就是说,一个字节用于变量字段,一个位用于位字段,除非您使用对齐属性指定更大的值。

标签: c++


【解决方案1】:

当使用 GCC 或 CLANG 编译时,会出现一个警告说 taking address of packed member of 'Packed' may result in an unaligned pointer value 这意味着您的代码的行为是未指定的。这就是为什么在使用 GCC 和 CLANG 编译时会有不同的输出。

__attribute__ ((packed)) 是什么意思?

压缩变量属性指定结构字段具有最小可能的对齐方式。也就是说,一个字节用于变量字段,一个位用于位字段,除非您使用对齐属性指定更大的值。

为什么不获取打包成员的地址?

获取打包成员的地址是危险的,因为减少了 指针的对齐丢失。这可能导致内存对齐 如果指针值被取消引用,则在某些体系结构中会出现故障。

参考资料:

【讨论】:

  • 关于您的报价:“获取压缩成员的地址是危险的,因为指针的减少对齐丢失了。如果指针值是,这可能会导致某些体系结构中的内存对齐错误取消引用。” 这在哪些架构中可能是危险的?在 x86-64 上怎么样?
猜你喜欢
  • 2018-12-08
  • 2011-03-05
  • 1970-01-01
  • 2012-09-15
  • 2012-06-22
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多