首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >内存对齐为结构-对齐大小等于最大成员大小

内存对齐为结构-对齐大小等于最大成员大小
EN

Stack Overflow用户
提问于 2014-10-07 14:53:33
回答 1查看 545关注 0票数 0

我想知道,为甚麽我们必须把一个结构的对齐尺寸,一个相等于最大成员大小的对齐大小,变成一个结构。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct MixedData
{
    char Data1;
    short Data2;
    int Data3;
    char Data4;
}; 

如果我们使用最大的成员(int Data3),对齐是4个字节,所以我们必须这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct MixedData  /* After compilation in 32-bit x86 machine */
{
    char Data1; /* 1 byte */
    char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
                         assuming that the address where structure begins is an even number */
    short Data2; /* 2 bytes */
    int Data3;  /* 4 bytes - largest structure member */
    char Data4; /* 1 byte */
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};

但是为什么我没有,在char Data1之后,char Padding1[3],所以short Data2adress(Data1) + 4开始,而不是char Data1[1]

而且,基于同样的逻辑,为什么我不让short Padding3[1]short Data2之后

另一个问题:如果我在64位处理器上,我应该使用8字节对齐,所以我必须设置以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct MixedData  /* After compilation in 64-bit x86_64 machine */
{
    char Data1; /* 1 byte */
    char Padding1[7]; /* 7 bytes */
    int Data3;  
    int Padding2[1]/* 4 bytes */
    char Data4; 
    char Padding3[7]; /* 7 bytes to make total size of the structure 24 bytes */
};

那么总大小24字节是8字节的倍数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-07 15:05:59

结构的整体对齐应该是对齐要求最大的元素。这是为了确保,例如,一组结构总是对齐的目的。如果没有,那么struct { int x; char c; };的大小将使第一个元素对齐,但接下来的三个元素将对齐x

通常可以说服编译器生成一个“打包”的数据结构(没有对齐填充),并使用它来获得一个填充数组,但是在所有非常特殊的情况下使用它是个坏主意,因为充其量它速度更慢,在最坏的情况下,它会由于处理器中的“未对齐访问陷阱”而导致执行停止。

如果int的大小是4个字节,那么对于我所知道的所有编译器来说-- long要么是4个字节,要么是8个字节,取决于编译器,无论是32位还是64位(至少x86)都是4字节对齐。

如果您希望在一个结构中有一个7字节的“间隙”,这将有效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct X { 
   char c;
   uint64_t x;
}; 

当然会有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct X { 
   char c;
   char padding[7]; 
   uint64_t x;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26246576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文