广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一篇文章带你了解C语言内存对齐公式
  • 534
分享到

一篇文章带你了解C语言内存对齐公式

2024-04-02 19:04:59 534人浏览 安东尼
摘要

目录一、前言二、公式2.1、例子一2.2、例子二2.3、例子三总结一、前言 每一个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。GCC中默认#program pack

一、前言

每一个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。GCC中默认#program pack(4),即4个字节的内存对齐。Keil也是采用4字节对齐的。也可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数,一般情况下尽量使用自然对齐系数,不要修改它。

STM32单片机上各个变量占用的字节数:

在这里插入图片描述

在这里插入图片描述

二、公式

公式一、结构体变量里,成员的起始地址必须满足 : 起始地址 % 成员的字节数(sizeof值)= 0 (说白了就是能整除)

公式二、结构体变量的总字节数必须满足:总字节数 % 最大的成员字节数 = 0 (说白了就是能整除)

2.1、例子一


struct te_a{
	
  
	char a;   
	int  b;   
	char c;   

}Test1;

OK,经过公式一的运算后,结构体里成员的分布如下:

在这里插入图片描述

经过公式一的计算后,结构体变量Test1的大小是9个字节。内存对齐的计算还没有结束,接着使用公式二计算:

结构体变量的总字节数 % 最大的成员字节数 = 0 , 在结构体变量Test1里,最大的成员是b,b的大小是4个字节。那么,当前的结构体变量大小9字节 % 4字节 等于 0 。当结构体变量大小为12字节 % 4字节 = 0,所以最终结构体变量Test1占用的内存字节数是12,其内存的分布如下:

在这里插入图片描述

以上的都是根据公式计算出来的结果,那实际在单片机里是不是这样呢?把代码下载到STM32单片机里,进入DEBUG模式看看。

在这里插入图片描述

在这里插入图片描述

从以下的内存分布看来,公式一与公式二的计算没有问题。

在这里插入图片描述

2.2、例子二


struct te_a{
	
  
	int   a;  
	float b;  
	char  c;  

}Test1;

OK,经过公式一的运算后,结构体里成员应该占用9个字节的内存,内存的分布如下:

在这里插入图片描述

接着根据公式二的运算,结构体的总字节数 % 最大的成员字节数 = 0, 可以轻松得出结构体的总字节数 = 12时,满足12 % 4 = 0。所以经过公式二的计算后,内存分布如下:

在这里插入图片描述

把代码烧录到STM32,进入Debug模式看看。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3、例子三


struct te_a{
	
  
	int     a;  
	float   b;  
	double  c;  

}Test1;

OK,经过公式一的运算后,结构体里成员应该占用16个字节的内存,内存的分布如下:

在这里插入图片描述

接着根据公式二的运算,结构体的总字节数 % 最大的成员字节数 = 0, 那么16 % 8 = 0,运气非常好,公式二不用补位就能让公式二成立。所以经过公式二的运算后,内存还是一样的:

在这里插入图片描述

把代码烧录到STM32,进入Debug模式看看。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 一篇文章带你了解C语言内存对齐公式

本文链接: https://www.lsjlt.com/news/132621.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你了解C语言内存对齐公式
    目录一、前言二、公式2.1、例子一2.2、例子二2.3、例子三总结一、前言 每一个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。GCC中默认#program pack...
    99+
    2022-11-12
  • 一篇文章带你了解C语言内存对齐
    目录内存对齐三、在内存对齐话题下的sizeof与offsetof宏3.1、sizeof3.2、offsetof宏3.3、Debug总结内存对齐 先看如下代码: 结构体Test1...
    99+
    2022-11-12
  • 一篇文章带你了解C语言内存对齐解决的问题
    目录一、内存对齐为4个字节的好处二、内存对齐的目的是以空间换取速度2.1、内存对齐为4的例子2.2、内存没有使用内存对齐的例子CPU读取数据的过程:三、掌握内存对齐的必要性总结一、内...
    99+
    2022-11-12
  • 一篇文章带你了解C语言--数据的储存
    目录前言数据类型介绍类型的基本归类整形在内存中的存储原码、反码、补码大小端介绍浮点型在内存中的存储前言 前面我们学习了C语言的一些基本知识和基础的语法,想必大家对C语言都有了自己的认...
    99+
    2022-11-12
  • 一篇文章带你了解C语言操作符
    目录一、操作符分类 二、算术操作符三、移位操作符1、左移操作符 2、右移操作符2.1算术移位 2.2逻辑移位 四、位操作符 1、按位...
    99+
    2022-11-12
  • 一篇文章带你了解C语言函数递归
    目录什么是递归?递归的两个必要条件递归实例实例1(按照顺序打印一个数的整形值)画图讲解 完整代码 实例2 (使用函数在不创建变量的情况下求字符串长度)画图讲解程序...
    99+
    2022-11-13
  • 一篇文章带你了解C语言:入门基础
    目录C语言本身特点数据类型常量变量变量分类使用小建议生命周期作用域常量分类及其特点字符串+转义字符+注释字符串转义字符两种注释选择循环语句函数数组总结闲话少说,先上思维导图。 如图...
    99+
    2022-11-12
  • 一篇文章带你了解C语言指针进阶
    目录1.字符指针2.指针数组3.数组指针4.函数指针5.数组传参总结1.字符指针 我们已经知道了数组名在大部分时候表示数组的地址,指针本质上也表示一个地址,那么我们能否用指针来创建一...
    99+
    2022-11-12
  • 一篇文章带你了解C语言二分查找
    目录总结我们常常需要对数据进行查找,修改,查找数据有许多方法,我们先看看最简单的顺序查找 int main() { int i, k = 0; scanf("%d", &am...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的文件操作
    目录为什么使用文件什么是文件程序文件数据文件文件名文件的打开和关闭文件指针fopen和fclose函数文件的顺序读写总结为什么使用文件 我们在想既然是通讯录就应该把信息记录下来,只有...
    99+
    2022-11-13
  • 一篇文章带你了解C语言中volatile关键字
    目录C语言中volatile关键字总结C语言中volatile关键字 volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多。 当不用这个关键字的时候,CP...
    99+
    2022-11-12
  • 一篇文章带你了解C语言:入门基础(2)
    目录操作符算术操作符移位操作符位操作符单目操作符逻辑反操作!操作符++,--逻辑操作符条件操作符逗号表达式常见关键字typedefexternstatic修饰局部变量修饰全局变量和函...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的选择结构
    目录一、if-else语句1.单选择 2.双选择3.多选择二.switch语句总结一、if-else语句 1.单选择 单选择通过if语句就可以实现,if语句的语法及执行流程...
    99+
    2022-11-12
  • 一篇文章带你了解JVM内存模型
    目录1. JVM介绍 1.1 什么是JVM?1.2 JVM的优点 1.2.1 一次编写,到处运行。1.2.2 自动内存管理,垃圾回收机制。1.2.3 数组下标越界...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的一些重要字符串与内存函数
    目录一.字符串函数1. 求字符串长度的strlen2.比较字符串大小的strcmp3.复制字符串的strcpy4.追加字符串的strcat5.查找字符串函数的strstr二、内存函数...
    99+
    2022-11-12
  • 一篇文章带你使用C语言编写内核
    目录gcc 命令文件头将内核载入内存总结gcc 命令 使用 gcc 编译 c语言 -c 编译、汇编到目标代码,不进行链接,也就是直接生成目标文件 -o 将输出...
    99+
    2022-11-12
  • 一篇文章带你了解C语言函数的可重入性
    目录一、不可重入函数。二、可重入函数。三、如何写出可重入的函数四、函数的可重入性和线程安全的关系五、malloc和printf为什么不可重入总结一、不可重入函数。 在函数中如果我们使...
    99+
    2022-11-12
  • 一篇文章带你了解论C语言中算法的重要性
    目录一、问题一(打印阶乘)问题描述:问题分析:解决方案:1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身2.这里要引入C++中STL库的一个知识点二、问题二(比较多项...
    99+
    2022-11-12
  • 一篇文章带你了解C++语法基础--字符串
    目录总结字符与整数的关联在于ASCII码:每一个常用字符都对应一个-128 ~ 127 的数字,二者之间是可以进行相互转换的: #include <iostream>...
    99+
    2022-11-12
  • 一篇文章带你了解C语言文件操作中的几个函数
    目录总结fopen:有两个参数,第一个是要被打开或者被创建的文件名,第二个是以什么方式打开。这两个参数要分别用双引号括起来 打开文件和关闭文件的基本流程,关闭文件之后要置空 f...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作