2011-02-18 44 views
1

在C编程语言中,我使用32位系统, 我有一个结构体,而且这个结构体大小是四的倍数。 但我看链接器映射文件大小是8 多个实例当为一个int64变量时,为什么struct size是8的倍数在32位系统中

typedef struct _str 
{ 
U64 var1, 
U32 var2 
} STR; 

这个结构的大小为16 但

typedef struct _str 
{ 
U32 var1, 
U32 var2, 
U32 var3 
} STR2; 

STR2的尺寸为12 我的工作32位ARM微控制器。 我不知道为什么

回答

1

结构的大小定义为具有最大对齐要求的成员的对齐的倍数。在您的平台上,即使在32位模式下,U64的对齐要求看起来也是8个字节。

下面的代码:在Linux x86_64的32位和64位模式下进行编译时

#include <stdio.h> 
#include <stdint.h> 
int main() { printf("alignof(uint64_t) is %zu\n", __alignof(uint64_t)); } 

产生相同的输出:

alignof(uint64_t) is 8 
3

第一个结构是为了填补得到它U64边界上对齐:在结构STR [1],每个U64的阵列中使用时,它相当于

struct STR 
{ 
    U64 var1; 
    U32 var2; 
    U8 pad[4]; /* sizeof(U64) - sizeof(U32) */ 
}; 

所以与ABI要求完全一致。

看看Procedure Call Standard for ARM Architecture,4.1基础数据类型。

+0

只有4“填充”字节。 – 2011-02-18 16:11:26

1

填充。

假设你有

typedef struct _str 
{ 
U64 var1, 
U32 var2 
} STR; 

STR s[2]; 

你的架构可以要求s[0].var1s[1].var1趴在自然对齐U64,在8字节边界。由于C没有在数组元素之间放置填充,因此填充会进入结构中。

在另一方面,

typedef struct _str 
{ 
U32 var1, 
U32 var2, 
U32 var3 
} STR2; 

STR2 s2[2]; 

只有4字节对齐这里需要。

1

一点背景,以帮助你关于这些问题的原因。由于原始内存操作通常以8的倍数指定,因此编译器工程师决定用于内存数据结构的填充方案。

如果内存检索操作(内存 - >总线 - > CPU)将是16位(在假设的计算机上)块,并且将3 * 8位类型放入结构中,编译器设计者可能会将它填充到一个32位结构,因为2,16位内存,检索操作将发生将您的结构拉入CPU操作的CPU缓存。

当然,您可以告诉编译器在异常情况下不要执行此操作,例如设计磁盘或网络协议,您可能希望空间有限。

在现实世界中这些问题都更复杂,但决定从最好的选择是什么通用的有效利用硬件的干:d

相关问题