_Alignof是否曾经返回与sizeof不同的值?例如,我尝试过的每一个值都是相同的:
printf("%zu %zu\n", _Alignof(int), sizeof (int));
printf("%zu %zu\n", _Alignof(char), sizeof (char));4 4 1 1
这两个值是否一直不同(与数组不同)?
发布于 2021-02-26 01:06:48
对于struct foo { int i; char c};,许多C实现为sizeof(struct foo)生成8个,为_Alignof(struct foo)生成4个,因为int是4个字节,并且需要对齐4个字节。这是因为结构必须有四字节对齐才能满足int对齐,而这需要添加三个字节的填充,所以结构大小对于int是四个字节,一个是char,三个是填充。
另一种可能是long double大小为16字节,但只需要8字节对齐。它可能是16个字节,因为它需要大量的数据,但是硬件可能只有一个8字节的总线,所以只需要8字节对齐就可以有效地加载任何对象的各个部分。
类似地,任何机器通常都会有一些最严格的对齐要求x字节,因为它的总线是x字节宽,或者它的处理器具有最大的通用字大小x,所以硬件只能一次以x字节块处理。然后,任何大于x字节的对象都必须由多个单词组成,并使用多个指令实现。对于这样的对象,不需要比x字节更严格的对齐。例如,一个8字节的整数可能由两个四字节对齐的四字节字构成,或者,在旧机器上,一个四字节的整数可能由两字节对齐的两个字节字构成。
发布于 2021-02-26 03:32:38
这两个值是否一直不同(与数组不同)?
示例差异,最有可能发现的是大类型。
printf("%zu %zu\n", sizeof(_Complex long double), _Alignof(_Complex long double));产出(取决于执行情况)
32 16发布于 2021-02-26 01:17:27
对于一个基本类型,一个典型的例子是32位平台上的long long int。它是一种64位类型,所以8字节,但由两个32位字组成,它们必须单独加载和存储,所以不需要比4字节更大的对齐。
https://stackoverflow.com/questions/66378407
复制相似问题