您的位置:首页 > 编程语言 > C语言/C++

c语言数据类型 之 内存对齐与位段

2016-03-02 01:11 375 查看

许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值 K(通常是 2、4 或 8)的倍数 k值取 = max{系统对齐大小 ,结构成员对齐大小} (对齐大小可人为设定)

内存对齐目的:是为了对齐数据以提高存储器的性能,加快内存的读取速度,提高寻址效率。



首先了解一下64位操作系统下不同类型数据所占字节数:


short : 2 字节

char : 1 字节 void * : 8 字节
unsigned char : 1 字节

short int : 2 字节 int : 4 字节 unsigned
int : 4 字节 long int : 8 字节

float : 4 字节 double : 8 字节

long : 8 字节 long
long : 8 字节 unsigned
long : 8 字节

在C语言中:



struct A

{

} a ; sizeof(a) = 0; //空结构体

struct A

{

char a;

short b;

int c;

} a ; sizeof(a) = 8; 系统对齐2 + 2 + 4 = 8 是2的倍数

/*************************************************************/

struct A

{

char a;

long b;

} a ; sizeof(a) = 16; 系统对齐8 + 8 = 16




struct B

{

char c;

A d;

long long e;

} a ; sizeof(a) = 32; 系统对齐(最大)8 + 16 +8 = 32 32 = max(8 ,8) * n (n位整数)

max (系统对齐大小 ,结构体对齐大小)

/*************************************************************/

struct test

{

char a;

short b;

char c;

int d;

} test1 ;
sizeof(test1) = 12; 系统对齐 char 2 + 2 + 系统对齐 char 4+ 4 = 12 12 是4的倍数

struct test2

{

short b;

char a;

char c;

int d;

}test 3; sizeof(test3) = 8;

struct A

{

char a;

short b;

int c;

struct B

{

ch ar d;

double e;

};

int f;

} a ; sizeof(a) = 12 系统对齐char 2+2+4+4 = 12 12是2的倍数

struct A

{

char a;

short b;

int c;

struct B

{

char d;

double e;

} f;

int g;

} a ; sizeof (a) = 32; 系统对齐char 2+2+4+(系统对齐 char 8 +8 = 16) + 4 = 28 max (2,8)=8 28+4=32 为8的倍数

内存对齐之结构体中添加位段:

struct B

{

char c1:6;

char c2:1;

int in:16;

}; sizeof (b) = 4

标记 c1,c2,in 分别需要 6位 1位 16位 一个字节8位

补充说明:

struct packed_struct

{

unsigned intf1 :1;

unsigned intf2 :1;

unsigned intf3 :1;

unsigned inttype :4;

unsigned intindex :7;

}; sizeof(structpackd_struct) = 4

当位段出现在结构定义中时, 至少会占用等同于unsigned int类型的空间,当所有的位段之和超出,分配另一个unsignedint空间。unsigned char或者其他类型不必考虑。

/************************************枚举类型*************************************/

struct A

{

enum a{

INDEX1,

INDEX2,

INDEX3,

INDEX4};

} a ; sizeof(a) = 0 枚举是类型不是变量不分配变量

/************************************联合体**************************************/

union B

{

short s1;

char c2;

short s2;

int in;

} b ;

union B

{

short s1:6;

char c2:1;

short s2:15;

int in:16;

} b ;

两个联合体 sizeof(b) 均为4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: