首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解C中的内存对齐约束和填充字节

理解C中的内存对齐约束和填充字节
EN

Stack Overflow用户
提问于 2015-05-26 14:51:41
回答 3查看 860关注 0票数 4

下面是代码片段。

代码语言:javascript
复制
#include<stdio.h>
int main(){
    typedef struct{
        int a;
        int b;
        int c;
        char ch1;
        int d;
    } str;
    printf("Size: %d \n",sizeof(str));
    return 0;
}

它提供的输出如下

代码语言:javascript
复制
Size: 20

我知道structure的大小大于structure组件大小的总和,因为填充是为了满足记忆对齐约束而添加的。我想知道如何决定要添加多少字节的填充。这取决于什么?它取决于CPU架构吗?它也取决于编译器吗?我在这里使用64位CPU和gcc编译器。如果这些参数发生变化,输出将如何变化。

我知道StackOverflow上也有类似的问题,但它们并没有彻底解释这种内存对齐约束。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-26 15:03:21

它一般取决于体系结构的需求。这里上有负载,但可以总结如下:

x86或ARM处理器上的基本C数据类型的存储通常不会从内存中的任意字节地址开始。相反,除char以外的每种类型都有对齐的要求;字符可以在任何字节地址上开始,但是2字节的短路必须从偶数地址开始,4字节的ints或浮动必须从可被4除的地址开始,8字节的长或双必须从可被8整除的地址开始。签名或无符号没有区别。

在您的例子中,可能会发生以下情况:sizeof(str) = 4 (4 bytes for int) + 4 (4 bytes for int) + 1 ( 1 byte for char) + 7 (3 bytes padding + 4 bytes for int) = 20

填充在那里,所以int位于一个4字节的多个地址上。这一需求来自于这样一个事实:int有4个字节长(我对您正在使用的体系结构的假设)。但这将因建筑而异。

票数 5
EN

Stack Overflow用户

发布于 2015-05-26 15:07:41

这取决于什么?它取决于CPU架构吗?它也取决于编译器吗?

至少CPU、操作系统和编译器。

票数 1
EN

Stack Overflow用户

发布于 2015-05-26 15:02:20

我知道它取决于CPU架构,我认为您可以在网上找到一些有趣的文章来讨论这个问题,维基百科在我看来还不错。

对我来说,我使用的是64位linux机器,我可以说的是,每个字段都是对齐的,因此它位于一个内存地址上(对于基本类型),内存地址可以被其大小整除,例如:

intfloat由4对齐(必须位于可被4整除的内存入口中)

charbool 1(这意味着没有填充)

doublepointers按8对齐

避免填充的最佳方法是将字段从最大到最小(当只有基本字段时)。

当有组合字段时,我在这里更难解释,但我认为您可以自己在一篇论文中找到它。

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

https://stackoverflow.com/questions/30461997

复制
相关文章

相似问题

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