c - GNU GCC 编译器 - 了解结构中的对齐属性
问题描述
我无法理解 C 中结构中的对齐属性。
从gcc 手册:
此属性为指定类型的变量指定最小对齐方式(以字节为单位)。例如,声明:
struct S { short f[3]; } __attribute__ ((aligned (8))); typedef int more_aligned_int __attribute__ ((aligned (8)));
强制编译器确保(尽可能)类型为 struct S 或 more_aligned_int 的每个变量将被分配并至少在 8 字节边界上对齐。
从上面的段落中我了解到,__attribute__((aligned(x)))
在 C 中添加任何类型的变量都会强制编译器为受影响的变量分配至少x个字节的大小。例如:
#include <stdint.h>
#include <stdio.h>
uint8_t foo __attribute__((aligned(4)));
typedef struct {
uint8_t x;
uint32_t y;
uint8_t z;
} __attribute__((aligned(8))) ex_struct_aligned_8_t;
int main(){
printf("Data/Structure Sizes:\n");
printf(" Aligned uint8_t Variable: %zu\n",sizeof(foo));
printf(" Aligned-8: %zu\n", sizeof(ex_struct_aligned_8_t));
return 0;
}
根据我的理解,输出sizeof(foo)
应该是 4,输出sizeof(ex_struct_aligned_8_t)
应该是 8。将结构中每个元素的大小加起来总共是 6 个字节,所以整个结构应该完全适合 8 个字节的内存对齐。尽管如此,当执行代码时,打印的值分别为 1 和 16。
我在这里缺少什么吗?也许它与架构有关?我在 gcc 版本 7.5.0 的 64 位操作系统(Ubuntu 18.04)中运行代码。
解决方案
推荐阅读
- c# - mscorlib 的 `System.Boolean` 如何避免结构布局循环?
- python - 获取要在 entry_field 小部件中填充的文件路径
- microcontroller - IR遥控接口PIC16f877a
- javascript - 如何以角度获取/显示数组对象的总长度
- c - 为什么 _SC_AIO_MAX 定义明确,而 sysconf(_SC_AIO_MAX) 返回 -1?
- android - 如果绑定适配器提供了设置器,请检查适配器是否正确注释以及参数类型是否匹配
- delphi - 如何在 Delphi 7 中使用 ComboBox 过滤 DBGrid 中的数据?
- azure - ARM模板 - 连接秘密名称时从密钥库中检索不起作用
- c# - 恢复密码在本地主机上有效,但在主机端无效
- java - javax.naming.NamingException:“com.stateful.ejb.ListItems”的查找失败