二、C语言小知识-指针和结构体究竟占几个字节
1、知识点:
- 我们在结构体这个整体中定义的成员变量是挨着的,这让我们容易误以为它们的存储方式也是挨着的,但其实并不是。
- 我们之前用sizeof测过,在gcc编译器下,不论什么类型指针,占用空间都是8字节;在VS编译器中,不论什么类型的指针,占用空间都是4字节。
- 在gcc编译器下,操作系统的1个操作字是8个字节(等于地址的存储范围,即寻址范围),因此每次存储、读取数据的都是按照8个字节来的。
1.指针:内存地址
16位机器的代码时,指针占2个字节。
32位机器的代码时,指针占4个字节。
64位机器的代码时,指针占8个字节。
2.结构体占用空间
特殊:大结构体的成员有小结构体
原则:
①大结构体整体的空间=max{大结构体成员(不包括小结构体整体),小结构体成员}*n;
②大结构体中,前面的成员变量=max{成员变量}*n
同理,大结构体中,小结构体前面的变量占空间=max{小结构体成员}*n
1、规则一(根据成员变量类型确定为结构体开辟内存的基本单位):与成员变量类型相关
- 知识点1【规则1制定的原因】:①能不能避免麻烦,直接给结构体分配一个很大的内存呢?当然不行,这是为了不造成过多的空置内存;②能不能对任意类型的结构体都规定一样的开辟基本单位?当然不行,这是为了针对不不同类型的结构体,制定不同的开辟速度,为了节省开辟时间;
- 知识点2【确定方法】:确定每个成员变量的开辟内存大小后,取大的那一个作为结构体开辟内存的单位
确定不同类型成员变量的开辟内存大小:
- char类型的成员变量:以1字节为单位开辟内存
- short类型的成员变量:以2字节为单位开辟内存
- int类型的成员变量:以4字节为单位开辟内存
- float类型的成员变量:以4字节为单位开辟内存
- double类型的成员变量:以8字节为单位开辟内存
- 任意指针类型的成员变量:以8字节为单位开辟内存
- 数组成员变量:把它看成上述基本类型的成员变量的集合
2、规则二(内存对齐原则):与成员变量类型相关
- 知识点【规则2制定的原因】:①能不能避免麻烦,在确定了结构体开辟内存的基本单位之后,直接在让成员变量挨着存储呢?当然不行,因为操作系统的1个操作字是8个字节,所以如果不规定字节对齐的话,对一个结构体成员取值,可能要取两遍,归纳起来就是用空间来换时间,提高CPU读取数据效率。
- 内存对齐,跟谁对齐?答案是结构体变量的首地址,也就是结构体变量中第一个成员变量的地址。
确定不同类型成员变量的对齐方法:假设将结构体变量的首地址看作基准0,那么某个成员变量开始存放的地址编号是该成员的数据类型所占内存大小的倍数。
- char类型的成员变量:与结构体变量首地址的相对地址是1字节的倍数。
- short类型的成员变量:与结构体变量首地址的相对地址是2字节的倍数。
- int类型的成员变量:与结构体变量首地址的相对地址是4字节的倍数。
- float类型的成员变量:与结构体变量首地址的相对地址是4字节的倍数。
- double类型的成员变量:与结构体变量首地址的相对地址是8字节的倍数。
- 任意指针类型的成员变量:与结构体变量首地址的相对地址是8字节的倍数。
- 数组成员变量:把它看成上述基本类型的成员变量的集合
例:32位机器上,以下结构的sizeof(P)为()
A 26 B 38 C 40 D 3
struct A {
int a;
char b;
int c;
char d;
};
struct P {
struct A w[2];
short b;
struct A* p;
}
struct A {
int a; //4B
char b; //由原则2,b的大小必须是a的整数倍,4B
int c; //4B
char d; //由原则2,c的大小必须是a的整数倍,4B
};//4*4=16B
struct P {
struct A w[2];//16*2=32B
short b;//由原则2,b的大小必须是a的整数倍,4B
struct A* p;//32位机,地址占4B
//由原则1,P的大小必须是max{A.a,A.b,A.c,A.d,P.B,P.p}=4的整数倍
//原大小=32+4+4=38,自动填充2B变为40B,
}
————————————————
参考原文链接:https://blog.csdn.net/lzh201864031/article/details/129900147
本文来自博客园,作者:种星记,转载请注明原文链接:https://www.cnblogs.com/zhongxingji/p/17697223.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)