c - 不带参数的结构对齐和 16 位目标上的对齐

标签 c

我有一些关于不带参数的结构对齐属性的问题。在声明具有如下所示对齐方式的结构时。

struct __attribute__ ((aligned))
{
     char a;
}s;
printf("%zu\n",sizeof(s));

输出为 16。
根据以下链接。 http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html

编译器会自动将类型的对齐方式设置为最大的对齐方式,该对齐方式曾经用于您正在编译的目标机器上的任何数据类型。

这意味着我不能声明大于 16 字节的对齐方式。但是如果我给

struct __attribute__ ((aligned(32)))
{
     char a;
}s;
printf("%zu\n",sizeof(s));

然后我得到输出 32。
这意味着我们可以声明大于 16 字节的对齐方式。
那为什么得到16字节?它是特定于编译器还是特定于目标?

在 16 位系统上对齐 — 我读到在 16 位系统上不会有任何对齐问题。谁能告诉我为什么?

最佳答案

如果编译器获得不合格的 __attribute__((aligned)) 属性,它默认为机器上最大的必需对齐方式。这与说“你不能设置更大的对齐方式”是不一样的;您的测试表明您可以明确设置更大的对齐方式。除非您明确表示,否则您不会获得更大(或更小)的对齐。

关于c - 不带参数的结构对齐和 16 位目标上的对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646596/

相关文章:

c++ - 插入语句的语法错误

c - 用 "U"指定无符号整数有什么意义?

CreateProcess 并捕获标准输出

c - 通过 TCP 连接发送格式化消息

c++ - 在哪种情况下 UDP 套接字上的 sendto() 返回 0?

c - 为不同签名的函数生成 C 代码,但实现相同

c - mxnet 无法 LoadLegacyJSON

c - 忽略c中命令行中的 '<'和 '>'

计算一个节点是否在 BST 中有任何子节点

C:使用指向指针的指针分配内存的正确语法