【发布时间】:2020-03-20 10:41:47
【问题描述】:
考虑这段代码:
#include <stdio.h>
#include <stdint.h>
#ifdef __GNUC__
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
#endif
#ifdef _MSC_VER
#define PACK( __Declaration__ ) __pragma(pack(push, 1)) __Declaration__ __pragma(pack(pop))
#endif
PACK(struct S
{
uint8_t f0;
uint32_t f1;
uint32_t f2 : 17;
});
int main()
{
printf("%zu\n", sizeof(struct S));
return 0;
}
没有给出编译器选项。
输出:
gcc (9.2.0): 8
clang (8.0.1): 8
cl (19.23.28106.4 for x86): 9
为什么在cl 的情况下sizeof 的结果是9?
标准是怎么说的?
【问题讨论】:
-
恕我直言,唯一正确的是
cl的输出。可能其他两个优化器太谨慎了...尝试为结构分配值并在函数中使用它们来强制编译器实现正确的空间。 -
人们倾向于对位域语义和表示做出比 C 语言规范支持的更多的假设。也可以添加一些扩展,例如结构包装,你最好抓住你的帽子。
-
@Frankie_C Clang 和 GCC 位包,即它们只存储使用的字节。 MSVC 可能只有字节包结构。
-
@S.S.Anne 我环顾四周,似乎
storage unit的不同解释是:对于 GCC/CLANG,它是基本内存单元(在这种情况下是 8 位字节),对于 MS它是用于位域说明符的最后一种类型。所以两者都符合C标准。
标签: c sizeof bit-fields packed