我用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))意思?
打包变量属性指定结构体字段具有最小可能的对齐方式。也就是说,一个字节表示一个变量字段,一个位表示一个位字段,除非您使用对齐属性指定了更大的值。
为什么不获取打包会员的地址呢?
获取打包成员的地址是危险的,因为指向对象的简化对齐会丢失。如果取消引用指针值,这可能会导致某些体系结构中的内存对齐错误。
参考:
| 归档时间: |
|
| 查看次数: |
13354 次 |
| 最近记录: |