结构体大小的计算、联合、位段
2017-08-20 17:46
211 查看
一、结构体大小的计算
硬件里的寄存器读取数据的整数倍,有个内存对齐的规则
struct A
{
int a;
int b;
};//8
struct B
{
char a;//1+3
int b;//4
};
struct C
{
char a;//1+1
short b;//2
int c;//4
};
struct D
{
char a;//1+3
int b;//4
short c;//2+6
double d;//8
};//24
struct E
{
char a;//1+1
short b;//2
int c;//4
double d;//8
};//16
E比D排兵布阵好(其实不一定,在一个平台可以这么说)
不同平台内存对齐规则不统一
规则1:将前面的加起来看是否是后面的整数倍(这个说法不准确,应该可以说将前一个加起来看是否是后一个的倍数,凑够最大字节的类型的倍数)
工作中:
struct F1
{
char a;
char x; //不使用,保留
short c;
int b;
double d;
};
struct F
{
int a;//4 最大单个整型
char b;//1
};//5+3,防止定义数组
结果不是5而是sizeof(F)=8 因为5不是4的倍数,所以加3
规则2:看所有字节加起来是不是最大单个类型的倍数
struct G
{
char a;//1+3
int b;//4
short c;//2
};//10+2
struct I
{
int a;
struct II
{
float b;
int c;
}d;//double d
int *p;
short e;
};//20
int main()
{
printf("%d\n",sizeof(struct I));
struct F sa;
struct F arr[2];//sizeof(arr) == 10
return 0;
}
二、位段
位段的声明和任何普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明为int、signed int或unsigned int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的数目。
位段可以很方便的访问单一值。
三、联合
联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。
四、结构体遇到段位怎么算大小?
1.struct B
{
int a:9;
int b:11;
int c:12;
}
计算方法:(9+11+12)/8=4 再看4是不是sizeof(int)的倍数,若不是,则补齐
2.struct B
{
int a:9;
int b:11;
}
计算方法:(9+11)/8=3 3不是sizeof(int)的倍数,那么+1 得4
五、联合体怎么计算大小?
union D
{
char a;
int b;
}
计算方法:单个成员占用最大的那个,结果:4
硬件里的寄存器读取数据的整数倍,有个内存对齐的规则
struct A
{
int a;
int b;
};//8
struct B
{
char a;//1+3
int b;//4
};
struct C
{
char a;//1+1
short b;//2
int c;//4
};
struct D
{
char a;//1+3
int b;//4
short c;//2+6
double d;//8
};//24
struct E
{
char a;//1+1
short b;//2
int c;//4
double d;//8
};//16
E比D排兵布阵好(其实不一定,在一个平台可以这么说)
不同平台内存对齐规则不统一
规则1:将前面的加起来看是否是后面的整数倍(这个说法不准确,应该可以说将前一个加起来看是否是后一个的倍数,凑够最大字节的类型的倍数)
工作中:
struct F1
{
char a;
char x; //不使用,保留
short c;
int b;
double d;
};
struct F
{
int a;//4 最大单个整型
char b;//1
};//5+3,防止定义数组
结果不是5而是sizeof(F)=8 因为5不是4的倍数,所以加3
规则2:看所有字节加起来是不是最大单个类型的倍数
struct G
{
char a;//1+3
int b;//4
short c;//2
};//10+2
struct I
{
int a;
struct II
{
float b;
int c;
}d;//double d
int *p;
short e;
};//20
int main()
{
printf("%d\n",sizeof(struct I));
struct F sa;
struct F arr[2];//sizeof(arr) == 10
return 0;
}
二、位段
位段的声明和任何普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明为int、signed int或unsigned int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的数目。
位段可以很方便的访问单一值。
三、联合
联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。
四、结构体遇到段位怎么算大小?
1.struct B
{
int a:9;
int b:11;
int c:12;
}
计算方法:(9+11+12)/8=4 再看4是不是sizeof(int)的倍数,若不是,则补齐
2.struct B
{
int a:9;
int b:11;
}
计算方法:(9+11)/8=3 3不是sizeof(int)的倍数,那么+1 得4
五、联合体怎么计算大小?
union D
{
char a;
int b;
}
计算方法:单个成员占用最大的那个,结果:4
相关文章推荐
- 位段、位段计算大小、枚举、联合
- 关于计算结构体大小的内存补齐规则(个人愚见)
- 如何计算结构体大小
- C语言中结构体大小计算即存储分配
- C中结构体大小的计算
- 计算结构体大小
- 关于硬盘种类、物理几何结构及硬盘容量、分区、扇区[linux]大小计算
- BMP图像结构及其大小计算
- 结构体的内存对齐方式(结构体大小计算 sizeof)(
- 【c语言】位段大小的计算以及宏的应用
- 【c语言】结构体大小计算的例子
- 结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小
- C语言精华记录——陆(结构、联合、位段、位级操作)
- 结构体和位段的大小计算
- Java对象结构及大小计算
- 结构体大小的计算方法
- 易语言 取结构体指针 计算结构体大小 复制结构体
- 结构体大小计算
- 一个有关计算结构体数组大小的问题
- 结构体,联合的位域定义方法,以及结构体大小的计算