【C/C++】结构体内存分配问题

规则1:以多少个字节为单位开辟内存
就是说,该结构体最终所占字节大小,是这个单位的整数倍
给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员
哪个基本类型的成员占字节数多,就以它大大小为单位开辟内存
在gcc中出现了double类型的例外
(1):成员中只有char型数据 ,以1字节为单位开辟内存。
(2):成员中出现了short 类型数据,没有更大字节数的基本类型数据。 以2字节为单位开辟内存
(3):出现了int 、float 没有更大字节的基本类型数据的时候以4字节为单位开辟内存。
(4):出现了double类型的数据
        情况1:
                在vc里,以8字节为单位开辟内存。
        情况2:
                在gcc里,以4字节为单位开辟内存
无论是那种环境,double型变量,占8字节。
(5):如果在结构体中出现了数组,数组可以看成多个变量的集合。
如果出现指针的话,没有占字节数更大的类型的,以4字节为单位开辟内存。
(6):在内存中存储结构体成员的时候,按定义的结构体成员的顺序存储。
规则2:字节对齐
所谓的起始内存单元,是结构体内该元素,相对结构体首地址的位置。
代码验证:
typedef struct user{char c;short  s;int a;
}user;user *u1 =(user*)malloc(sizeof(user));printf("u1- %p\n char -%p\n short -%p\n int -%p\n",u1,&(u1->c),&(u1->s),&(u1->a));

结果:

(1):char
1字节对齐 ,即存放char型的变量,起始内存单元的编号是1的倍数即可。
(2):short
2字节对齐 ,即存放short int 型的变量,起始内存单元的编号是2的倍
数即可。
(3):int
4字节对齐 ,即存放int 型的变量,起始内存单元的编号是4的倍数即
(4):long 在32位平台下,4字节对齐 ,即存放long int 型的变量,
起始内存单元的编号是4的倍数即可
(5):float
4字节对齐 ,即存放float 型的变量,起始内存单元的编号是4的倍数即
(6):double
        a.vc环境下
                8字节对齐,即存放double型变量的起始地址,必须是8的倍数,double变量
占8字节
        b.gcc环境下
                4字节对齐,即存放double型变量的起始地址,必须是4的倍数,double变量
占8字节。
注意:
当结构体成员中出现数组的时候,可以看成多个变量。
开辟内存的时候,从上向下依次按成员在结构体中的位置顺序开辟空间
 struct stu{int num;int age;}lucy;8字节struct stu{char sex;int age;}lucy;8字节struct stu{char a;short int b;int c;}temp;8字节struct stu{char a;int c;short int b;}temp;12字节struct stu{char buf[10];int a;}temp;16字节struct stu{char a;double b;};12字节

为什么要有字节对齐?
用空间来换时间,提高cpu读取数据的效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/129067.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

竞赛选题 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

快手商品数据整合API|获取快手商品详情数据价格销量主图宝贝链接

接口名称:ks.item_get 接口路径:https://api-seaver.cn/ks/item_get 功能介绍: 通过调用此API可获取商品详情数据,包括商品ID、宝贝标题、商品简介、价格、原价、掌柜昵称、库存、宝贝链接、宝贝图片、品牌名称、商品详情、商品…

Visual Studio 2022 修改字符集的方法

在射频识别技术课程实验过程中发现的报错问题,搞了半天才找到原因,是字符集设置有问题。下图为报错: 根本原因是默认的字符编码集是Unicode。 改成使用多字节字符集就好了。以下为修改方法。

vue3 antv 静态登录页面

效果图 <template> <!-- 内容区域 --><div class"main"><div class"from"><!-- 表单 model是antv里边的绑定表单数据 --><a-form :model"formState" ref"formRef"><!-- 切换 --><a-tabs…

手写模拟SpringBoot核心流程

通过手写模拟实现一个Spring Boot&#xff0c;让大家能以非常简单的方式就能知道Spring Boot大概是如何工作的。 依赖 建一个工程&#xff0c;两个Module: 1.springboot模块&#xff0c;表示springboot框架的源码实现 2.user包&#xff0c;表示用户业务系统&#xff0c;用来写…

【刷题】只出现一次的数字(三种解法)

【刷题】只出现一次的数字 文章目录 【刷题】只出现一次的数字解法异或运算解法一 : 异或运算解法二:集合类Set集合Map集合 链接: https://www.nowcoder.com/share/jump/2008263481696810321082 https://leetcode.cn/problems/single-number/description/ 题目描述 给定一个整…

基于Java的民宿管理系统设计与实现(源码+lw+部署文档+讲解等)(民宿预约、民宿预订、民宿管理、酒店预约通用)

文章目录 前言具体实现截图论文参考详细视频演示代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技…

运行软件找不到mfc140u.dll怎么解决,mfc140u.dll是什么文件

"找不到 mfc140u.dll"是一条错误信息&#xff0c;表示您的计算机上缺少一个名为 mfc140u.dll 的动态链接库&#xff08;DLL&#xff09;文件。这个文件通常与 Microsoft Visual C Redistributable 相关。Mfc140u.dll 是 Microsoft 基础类库&#xff08;MFC&#xff0…

Linux: 基础IO

学习目标 1.C接口与系统调用接口的差别 2.文件描述符, 重定向, 一切皆文件, 缓冲区 3.fd与FILE, 系统调用和库函数的关系 4.系统中的inode 5.软硬链接 6.动静态库 预备知识 1.文件 内容 属性 2.文件的所有操作: a. 对内容的操作 b.对属性的操作 3.文件在磁盘(硬件)上, 我…

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现&#xff0c;材质空白的情况&#xff08;如下图所示&#xff09;&#xff0c;今天终于找到问题原因&#xff0c;记录下来&#xff0c;让大家避免踩坑。 其实原因很简…

Pikachu靶场——跨站请求伪造(CSRF)

文章目录 1. 跨站请求伪造&#xff08;CSRF&#xff09;1.1 CSRF(get)1.2 CSRF(post)1.3 CSRF Token1.4 CSRF漏洞防御 1. 跨站请求伪造&#xff08;CSRF&#xff09; 还可以参考我的另一篇文章&#xff1a;跨站请求伪造(CSRF) 全称Cross-site request forgery&#xff0c;翻译…

c++day3

1> 思维导图 2> 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>us…