数据结构之内存条的解释及结构体字节对齐(对齐超全)
目录
内存条:
kernel 内核
环境参数
栈区(系统自动分配和释放空间、顺序栈、链栈(中缀表达式及后缀表达式))
mmap映射区(映射文件描述符和指定文件的区域到调用进程的内存区域)
堆区(手动开辟和释放空间malloc / free)
.bss(为初始化的全局变量/静态变量,会自动初始化为0)
.data(初始化的全局变量/静态变量)
【.bss 和 .data 为全局变量区/静态区】
字符串常量区
.text 代码段 0-0x00000000
特点:
全局变量:浪费资源 ,效率低,访问时间长,不安全,但是生成周期长,不再需要传参等,但是这不适用于大型项目,比如说服务器,服务器要时刻保持运转,也就是说可以随时访问
局部变量:该循环或者函数中适用,比如for(int i)或是 main(){ int i; }
注意:全局变量a,当局部变量也定义了一个a,那么全局变量将在该方法中被掩盖,以局部变量为准,另外,这里可以考虑函数的传参和传地址。
malloc:开辟的空间是连续的,该空间可能含有原来的内容(脏数据),因此要用memset()函数清零,另外,当手动开辟空间后,要用free()函数释放,不然会造成内存泄露。
c语言类型:
char 1 short 2 int 4 float 4 long 8 double 8 long long 8
long double 16 注意:不同版本大小不一样,这里是ubuntu20.04
判断结构体的大小:
话不多说,先上代码
root@ubuntu:/Liunx/shell/shuzu# cat 112.c /*=============================================== * 文件名称:111.c * 创 建 者: * 创建日期:2022年04月26日 * 描 述: ================================================*/ #include <stdio.h> struct data{ char a; char c; short b; int d; double e; }a; int main(int argc, char *argv[]) { printf("sizeof(a)=%d\n",sizeof(a)); return 0; }root@ubuntu:/Liunx/shell/shuzu# cat -n 11.c 1 /*=============================================== 2 * 文件名称:11.c 3 * 创 建 者: 4 * 创建日期:2022年04月26日 5 * 描 述: 6 ================================================*/ 7 #include <stdio.h> 8 struct data{ 9 char a; 10 short b; 11 char d; 12 int c; 13 }a; 14 int main(int argc, char *argv[]) 15 { 16 int b = sizeof(a); 17 printf("b=%d\n",b); 18 printf("%d\n",sizeof(short)); 19 return 0; 20 }root@ubuntu:/Liunx/shell/shuzu# cat 111.c /*=============================================== * 文件名称:111.c * 创 建 者: * 创建日期:2022年04月26日 * 描 述: ================================================*/ #include <stdio.h> struct data{ char a; short b; char c; int d; double e; }a; int main(int argc, char *argv[]) { printf("sizeof(a)=%d\n",sizeof(a)); return 0; }root@ubuntu:/Liunx/shell/shuzu# cat 112.c /*=============================================== * 文件名称:111.c * 创 建 者: * 创建日期:2022年04月26日 * 描 述: ================================================*/ #include <stdio.h> struct data{ char a; char c; int d; short b; double e; }a; int main(int argc, char *argv[]) { printf("sizeof(a)=%d\n",sizeof(a)); return 0; }试试能不能判断出占多少字节!结果为16 12 24 24。
注意:为了寻址的方便,char short char 和 char char short 所占字节数不一样,前者6,后者4,因为计算机为了寻址方便,所以当char 遇见 short 会自动将该char 变为 2,char int也类似,总之,计算机为了保持地址所占的一致性,如果前者遇见了比自己占比大的,便会自动对齐为那个比自己占比大的所占空间。
例如:
char short 4
char int 8
char double 16
char char short 4 这里可以理解为两个char所占空间敲好于short相等
char int char short 12
char double char short 24 这里虽然char int 占四个字节,但是由于有double,因此又需对齐double cahr 1空 double char 1空 short 4空
char char short char 6
char short int 8
=====================================================================
重点:
struct demo{};
32位机:1,占位
64位机:0,不占位
字节对齐:
①一般来讲,都是以最高位对齐
②但同时也要尽量节省空间
32位:
long 4
float 4
double 8
32位结构体中有long,有double,按4字节对齐,double占两个四字节,也就是最高4字节对齐
64位:
long 8
float 4
double 8
最高8字节对齐那么问题来了:
为什么32位机最高是4字节对齐在,64位是8字节对齐呢?
这是因为32位机只有32根地址线,也就是32个bit位,最高可以寻到2的32次方个字节,
32=4*8,一个字节占8个bit位,所以最高字节对齐为4
同理,64位机有64根地址线,64=8*8,那么自然字节对齐最高为8位
为什么要字节数对齐:用空间换时间对于内部临时需要更改的结构体对齐方式:
①#pragma pack (n),编译器将按照n 个字节对齐;
②#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体仍然按照size 最大的成员进行对界。
注意:字节对齐32位最大能修改成4,64位最大为8
更多推荐
所有评论(0)