首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尺寸vs _Alignof值

尺寸vs _Alignof值
EN

Stack Overflow用户
提问于 2021-02-26 00:21:25
回答 4查看 83关注 0票数 0

_Alignof是否曾经返回与sizeof不同的值?例如,我尝试过的每一个值都是相同的:

代码语言:javascript
复制
printf("%zu %zu\n", _Alignof(int), sizeof (int));
printf("%zu %zu\n", _Alignof(char), sizeof (char));

4 4 1 1

这两个值是否一直不同(与数组不同)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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字节的整数可能由两个四字节对齐的四字节字构成,或者,在旧机器上,一个四字节的整数可能由两字节对齐的两个字节字构成。

票数 4
EN

Stack Overflow用户

发布于 2021-02-26 03:32:38

这两个值是否一直不同(与数组不同)?

示例差异,最有可能发现的是大类型。

代码语言:javascript
复制
printf("%zu %zu\n", sizeof(_Complex long double), _Alignof(_Complex long double));

产出(取决于执行情况)

代码语言:javascript
复制
32 16
票数 2
EN

Stack Overflow用户

发布于 2021-02-26 01:17:27

对于一个基本类型,一个典型的例子是32位平台上的long long int。它是一种64位类型,所以8字节,但由两个32位字组成,它们必须单独加载和存储,所以不需要比4字节更大的对齐。

试试哥德波特

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66378407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档