【C语言】变量占用内存的大小内存对齐

server/2024/9/23 9:25:46/
                 32位系统     64位系统
类型              大小           大小
char               1             1
char *             4             8int                4             4
int  *             4             8
short              2             2
short int          2             2
long               4             4
long int           4             4
long long          8             8
unsigned long long 8             8double             8             8
long double        8             8
float              4             4bool               1             1

当然,你也可以用sizeof()来查看变量占用内存的大小

内存对齐

为什么会有内存对齐?

无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能在自然边界上对齐。原因在于为了访问未对齐的内存处理器需要作两次内存访问的操作,对齐后则只需一次,效率大大提升。

数据成员对齐规则

结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

#include<stdio.h>
typedef struct bb
{int id;             //[0]....[3]double weight;      //[8].....[15]float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]
}BB;typedef struct aa
{char name[2];     //[0],[1]int  id;         //[4]...[7]double score;     //[8]....[15]    short grade;    //[16],[17]        BB b;             //[24]......[47]
}AA;int main()
{AA a;printf("%d\n%d",sizeof(BB),sizeof(a));return 0;
}

输出结果为:

24
48

#pragma pack()

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为16 32

BB是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

#pragma pack指令可以用来调整编译器的默认对齐方式,将会按照n个字节进行对齐。若直接使用#pragma pack()而不加参数则编译器会取消自定义字节对齐方式。

但是需要注意的是,按照n个字节对齐并非是每个数据都必须是n个字节。每个成员还是按照自己的方式对齐,只不过对齐时从对齐参数(通常是该类型的大小)和n中取较小的那个。

#include<stdio.h>
#pragma pack(8)
typedef struct bb
{int id;char ch;
}BB;
int main()
{printf("%d",sizeof(BB));return 0;
}

输出为:8

参考博文:

https://blog.csdn.net/hairetz/article/details/4084088

https://blog.csdn.net/czc1997/article/details/81090740


http://www.ppmy.cn/server/23170.html

相关文章

数据结构(九)---并查集

目录 1.集合 2.集合的相关操作 (1)查(Find)&#xff1a; •Find操作的优化 (2)并(Union)&#xff1a; •Union操作的优化 1.集合 数据元素之间的逻辑关系可以为集合&#xff0c;树形关系&#xff0c;线性关系&#xff0c;图关系。对于集合而言&#xff0c;一个集合可以划…

CSS基础——3.CSS盒子模型、浮动、定位

盒子模型是网页设计中经常用到的一种思维模型,由四个部分构成,从内到外分别为内容区(content)、内边距(padding)、边框(border)和外边距(margin),CSS 为这四个部分提供了一系列相关属性,通过对这些属性的设置可以丰富盒子的表现效果。 盒子的组成 外边距:margin 内…

EMQX 需要开放的端口各个都是什么意思

文章目录 问题描述解决方案 问题描述 大家好&#xff01;我是夏小花&#xff0c;今天在研究MQTT时&#xff0c;我是用docker装的&#xff0c;但是装完之后需要启动&#xff0c;然后看到docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 1808…

自动化密码填充:使用Python提高日常工作效率

密码是我们日常生活中难以逃脱的一部分。从解锁电脑到登录各种服务&#xff0c;我们需要记住无数的密码。幸运的是&#xff0c;通过Python和一些有用的库&#xff0c;我们可以简化填入密码的过程&#xff0c;使日常任务自动化变得简单。在本文中&#xff0c;我们将探讨如何使用…

探索互联网医院系统源码:在线问诊小程序开发教学

在线问诊小程序作为互联网医院系统的重要组成部分&#xff0c;为患者提供了更便捷、高效的医疗服务&#xff0c;成为了人们生活中不可或缺的一部分。今天&#xff0c;小编将带您探索互联网医院系统的源码&#xff0c;并介绍在线问诊小程序的开发教学&#xff0c;带领读者深入了…

httpClient提交报文中文乱码

httpClient提交中文乱码&#xff0c;ContentType类型application/json 指定提交参数的编码即可 StringEntity se new StringEntity(paramBody.toJSONString(),"UTF-8");se.setContentType("application/json");context.httpPost.setHeader("Cookie&…

Android --- 常见UI组件

TextView 文本视图 设置字体大小&#xff1a;android:textSize"20sp" 用sp 设置颜色&#xff1a;android:textColor"#00ffff" 设置倍距(行距)&#xff1a;android:lineSpacingMultiplier"2" 设置具体行距&#xff1a;android:lineSpacingExtra&q…

ClickHouse用UDF解析XML字符串和XML文件

一.如果是读取xml文件的时候&#xff0c;文件入库需要使用文件读取UDF 创建了1个测试文件 wsdFileRead()&#xff1a; 直接读取文件内容 SELECT wsdFileRead(/home/temp/wsd_test.xml)Query id: 09b6e5fe-7169-43f7-b001-90e2eeabb8da┌─wsdFileRead(/home/temp/wsd_test.xm…