C语言结构体的内存分配
一、结构体内存分配原则
原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。
原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。
注意:如果有充分的理由决定不对结构的成员进行重排,以减少因对齐带来的空间损失。列如,为了提高程序的可维护性和可读性,将相关的结构成员存储在一起。应该根据结构成员的边界需要进行重排,减少因边界对齐而造成的内存损失。
二、结构体长度
- sizeof操作能够得出一个结构的整体长度,包括因边界对齐而跳过的那些字节。
- offsetof能查找指定成员的实际位置
offsetof(type, member);
// type 结构体类型
// member 结构体成员
三、测试程序
#include <stdio.h>
#include <stddef.h>
int main(int argc, char *argv[]) {
struct struct_test1 {
char a;
int b;
char c;
};
struct struct_test2 {
int a;
char b;
char c;
};
printf("The length of structure test1 is: %ld \r\n", sizeof(struct struct_test1) );
printf("Location of parameter B: %ld \r\n", offsetof(struct struct_test1, c) );
printf("The length of structure test1 is: %ld \r\n", sizeof(struct struct_test2) );
printf("Location of parameter B: %ld \r\n", offsetof(struct struct_test2, c) );
return 0;
}
运行结果:

从运行结果可以得出 结构成员排序会影响内存的大小。
C语言结构体的内存分配的更多相关文章
- C语言结构体变量内存分配与地址对齐
地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下 ...
- C语言 结构体的内存对齐问题与位域
http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地 ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- C语言结构体的内存对齐问题
在C语言开发当中会遇到这样的情况: #include <stdio.h> struct test { int a; char b; }; int main(int argc, const ...
- C语言结构体在内存中的存储情况探究------内存对齐
条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类 ...
- 3.c语言结构体成员内存对齐详解
一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 #include <stdlib.h> #include <stdio.h> stru ...
- C语言结构体及其内存布局
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- C语言结构体占用空间内存大小解析
结构体的数据类型的有点我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧. 格式一: 01.struct tagPhone 02.{ 03. char A; 04. int ...
- c语言结构体在内存中存储,字节对齐
注意: 出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则: (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除: (2)结构体每个 ...
- 36深入理解C指针之---结构体的内存处理
一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...
随机推荐
- 记录--前端加载超大图片(100M以上)实现秒开解决方案
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 前端加载超大图片时,一般可以采取以下措施实现加速: 图片压缩:将图片进行压缩可以大幅减小图片的大小,从而缩短加载时间.压缩图片时需要 ...
- vscode 屏蔽某些文件夹
vscode 屏蔽某些文件夹 File--Preferences--Settings(Ctrl + ,) 搜索框里搜索 Files:Exclude 点击 Add Pattern ,如果想屏蔽掉所有 . ...
- 关于GDPR体系文件介绍,介绍GDPR体系文件的内容和意义
随着数字化时代的到来,个人数据保护成为了一个日益受到关注的问题.欧盟于2018年5月25日颁布了"通用数据保护条例"(GDPR),旨在加强对欧洲公民个人数据的保护.GDPR对企业和 ...
- MySQL数据过滤和搜索
操作符 AND操作符 mysql> SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 AND prod_p ...
- Spring Bean 的一生
Spring Bean 的一生包括其从创建到消亡的整个过程: 实例创建 => 填充 => 初始化 => 使用 => 销毁. 这里需要注意的是,从 bean 实例的创建到可以使用 ...
- #扫描线,线段树#nssl 1459 空间复杂度
分析 由于\(k\leq 10\)所以考虑用总方案减去经过两个差的绝对值\(\leq k\)的点的路径数 分类讨论一下发现要处理祖先关系和其它关系两种情况,考虑怎么去重,可以将这些答案看作一个个矩形, ...
- #线段树#洛谷 3988 [SHOI2013]发牌
传送门 分析 fake:此题不就是链表模拟题吗,我一开始还真这么想 貌似链表什么用都没有,根据题意很清楚,要找一个支持删除和查询区间第\(k\)大的数据结构 解释一下为什么题目可以转换为查询区间第\( ...
- 使用 rollup 打包可按需加载的 NPM 包
安装 rollup npm install rollup --save-dev 配置文件 rollup.config.js export default { input: 'src/index.js' ...
- 5. Determinant
5.1 The Properties of Determinants The determinant of the n by n identity matrix is 1 : \(det I = 1\ ...
- VMware下CentOS7.6安装openGauss
VMware 下 CentOS7.6(7.9)安装 openGauss centos 安装 这里我使用的是 vmware workstation Pro 15 虽然官网了解了一下 openGauss ...