打包成员的引用地址不等于打包成员的地址?

edd*_*kuo 2 c++

我用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;
}
Run Code Online (Sandbox Code Playgroud)

Nut*_*ker 10

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

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

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

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

获取打包成员的地址是危险的,因为指向对象的简化对齐会丢失。如果取消引用指针值,这可能会导致某些体系结构中的内存对齐错误。

参考: