数据类型的长度一直是我以前最不愿意面对的,又多又繁琐对于像我这样记性不好的人来说绝对是个噩梦啊。但是必须得记啊,经过总结,发现也并不是想象中那么的难啊。
sizeof
首先说明一下,sizeof()是一个纯种关键字,和函数没有半点关系。它是一个复杂类型关键字,负责得到特定类型或特定类型变量的大小。将这些结果总结一下,会对记忆有很大帮助。
32位系统中:
数据类型 | 说明 | 字节数 | 取值范围 |
bool | 布尔型 | 1 | true,false |
char | 字符型 | 1 | -128~127 |
unsigned char | 无符号字符型 | 1 | 0~255 |
short | 短整型 | 2 | -32768~32767 |
unsigned short | 无符号短整型 | 2 | 0~65535 |
int | 整型 | 4 | -2147483648~2147483647 |
unsigned int | 无符号整型 | 4 | 0~4294967295 |
long | 长整型 | 4 | -2147483648~2147483647 |
unsigned long | 无符号长整型 | 4 | 0~4294967295 |
float | 单精度型 | 4 | -3.4×10-38~3.4×10-38 |
double | 双精度型 | 8 | -1.7×10-308~1.7×10-308 |
long double | 长双精度型 | 8 | -1.7×10-308~1.7×10-308 |
char buf[128] | 字符串 | 128 |
|
指针 | 4 |
| |
数组 | 长度*下标 |
|
64位系统中:
数据类型 | 说明 | 字节数 |
bool | 布尔型 | 1 |
char | 字符型 | 1 |
unsigned char | 无符号字符型 | 1 |
short | 短整型 | 2 |
unsigned short | 无符号短整型 | 2 |
int | 整型 | 4 |
unsigned int | 无符号整型 | 4 |
long | 长整型 | 8 |
unsigned long | 无符号长整型 | 8 |
float | 单精度型 | 4 |
double | 双精度型 | 8 |
long double | 长双精度型 | 16 |
char buf[128] | 字符串 | 128 |
指针 | 8 | |
数组 | 长度*下标 |
结构体的sizeof
以下是先辈总结的内容,感觉写的很好,简单易懂。拿来引用一下,具体出自哪位高人之手也已不得而知。总之感谢一下编程界的各位前辈,为我们总结这些宝贵的知识。接下来我们以32为操作系统为基础进行讨论:
- struct 结构大小和顺序、#progma pack参数有关系
- struct 子项在内存中的按顺序排列,在没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度。
- 在有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n);
- struct 整体的对齐系数为子项对齐系数最大值。
struct A{
char a; //字长1对其系数1
char b; //字长1对其系数1
char c; //字长1对其系数1
};//整体对其系数为1
因此sizeof(struct A)=3;
char[32]字符类型的数组,是相当于32个独立且连续的内存空间,每一个字长1对其系数1。
struct B {
int a; //对其系数4
char b; //对其系数1
short c; //对其系数2
};//整体对其系数4
short c对其系数2必须和偶地址对其,int a同理也与能4的倍数地址对其。
粉色内存被结构占用因此sizeof(strcut B)=8。
struct C {
char b; //对其系数1
int a; //对其系数4
short c; //对其系数2
};//整体对其系数4
int a 从4的倍数地址开始,所以开始地址是4,因为结构整体对其系数为4,因此short c后的两个内存被占用,使大小为4的倍数。sizeof(struct C)=12
#progma pack (2)
struct D {
char b; //对其系数min(长度=1,n=2)=1
int a; //对其系数min(长度=4,n=2)=2
short c; //对其系数min(长度=2,n=2)=2
};//整体对其系数2
#progma pack (2) 对int a的放置产生影响,
#progma pack (n) 只能取1、2、4
因此 sizeof(struct D)=8
总结
sizeof一般在动态分配内存时常会被用到,尤其是给struct分配内存空间时一定要多加注意。最后强调一下,sizeof是个关键字。