【嵌入式编程】内存分布

news/2025/1/7 9:43:08/文章来源:https://www.cnblogs.com/o-O-oO/p/18653331

一、内存分布图

在操作系统中,内存被组织和管理以支持进程的运行。以下是一些常见的内存分布概念:

【内核空间】:操作系统内核使用的内存区域,用于存储内核代码、数据结构和进程控制块(PCB)。【用户空间】:存储用户的代码。未初始化变量区(.bss):存放未初始化的全局变量和静态变量。已初始化变量区(.data):存放已初始化的全局变量和静态变量。常量区(.rodata):存储程序中定义的所有字符串常量和其他被const修饰的全局变量。栈区(.stack):用于函数调用时存储局部变量、参数和返回地址,空间通常向下增长(由高地址向低地址)。堆区(.heap):用于动态内存分配,如 C 语言中的malloc或 C++中的new,空间通常向上增长(由低地址向高地址)。数据区:存储全局变量、被const修饰的全局变量和被static修饰的静态变量。文本区(.text):存储程序代码,通常是只读的,也就是只有访问权而没有写入权。

注意事项:

在 C 语言言中常量有很多种,比如常见的:

字符常量:'a','A','*'。字符串常量:"helloworld","ilovechina","12345"。整常量:25,10,012,0x0a,0b00001010。浮点常量:3.14,123.456,3.0E-23。

但并不是所有的常量都会被编译器放在常量区的,例如:

#include <stdio.h>int main(void)
{int i = 10;return 0;
}

代码中定义了一个整型局部变量i,并被初始化为了 10,其中i是变量,10是常量,但编译器并不将10放入常量区,而是在汇编指令中直接通过立即数赋值。

这是因为编译器认为普通的整型、浮点型或字符型常量所占空间很小,使用起来很简单,认为将它们直接嵌入到代码中,而不是单独存储在常量区,这样会更加高效。如此节省了运行、访问的时间和存储空间。

二、那什么样的数据才将放入常量区(.rodata)呢?

1、字符串常量

#include <stdio.h>int main(void)
{char *p = "hello world";return 0;
}

对于上方代码片段中的指针 char *p = "hello world";,指针 p 存储在栈上,

"hello world"字符串被放置在程序的常量区(.rodata) 中,指针 p 指向字符串常量 "hello world" 在常量区(.rodata)中的地址。

这是因为字符串字面量在程序的整个生命周期内不会改变,因此放在常量区(.rodata)可以节省内存并提高效率。

但是,当一个字符常量串被用来为数组初始化的时候,那么该字符串常量将不被放入常量区,而是放入对应的数组中,也就是数据区(.data)中。

例如:

#include <stdio.h>int main(void)
{char str[20] = "hello world";return 0;
}

对于数组char str[20] = "hello world";,字符串常量 "hello world" 本身是存储在 .text区,但在初始化的过程中,该字符串会被复制到 str 数组中。这意味着字符串的实际内容会存储在 str 数组所在的内存区域,即在程序的数据段中(通常被称为.data区)。

两者不同的地方在于指针 p 本身存储在栈上,指向只读数据段中的字符串常量,而数组 str 存储在数据段中,并包含字符串常量"hello world"的副本。

2、 被const修饰的全局变量

#include <stdio.h>const int value_0 = 10;
int value_1 = 20;int main(void)
{const int value_2 = 30;return 0;
}

value_0全局变量被const修饰,所以被存储在常量区(.rodata)中;而value_1变量虽然也是全局变量,但并没有被const修饰,所以存储在了(.data)中。

但并不是所有被const修饰的变量都存储在常量区(.rodata),例如value_2变量是局部变量,被const修饰后仅仅意味着在表达式上不能显式地更改变该变量的值,否则语法错误,但该变量仍存放在栈区。

原创 ZRQRS 知睿电子工程师

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

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

相关文章

北京健康证(立水桥地铁站附近)

体检:记得带身份证就可以,最好自带一支笔,用他的笔要排队,我买的是96的,带培训证的。 下面这个表只填:身份证号,手机号,姓名就可以,类别、是否培训以交钱时候前台登记的为准,照片也不采集,直接用身份证上的相片

北京健康证

体检:记得带身份证就可以,我买的是96的,带培训证的。 下面这个表只填:身份证号,手机号,姓名就可以,类别以交钱时候前台登记的为准,照片也不采集,直接用身份证上的相片

anaconda安装与环境配置

一、Anaconda简介 ​ Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、…

java学习报告

Java学习报告 目录 第一章 初识java与面向对象程序设计 1 第二章 java编程基础 3 第三章 面向对象程序设计(基础) 13 第四章 面向对象程序设计(进阶) 15 第五章 异常 17 第六章 java常用类 1720 初识java与面向对象程序设计Java概述计算机编程语言发展史“计算机之父”冯诺…

PyTorch Geometric框架下图神经网络的可解释性机制:原理、实现与评估

在机器学习领域存在一个普遍的认知误区,即可解释性与准确性存在对立关系。这种观点认为可解释模型在复杂度上存在固有限制,因此无法达到最优性能水平,神经网络之所以能够在各个领域占据主导地位,正是因为其超越了人类可理解的范畴。 其实这种观点存在根本性的谬误。研究表明…

25. K 个一组翻转链表(难)

目录题目法一、模拟--迭代法二、递归 题目给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而…

OpenWrt 系统UCI详解(Lua、C语言调用uci接口实例)

1 UCI简介 “uci"是"Unified Configuration Interface”(统一配置界面)的缩写,用于OpenWrt整个系统的配置集中化。 很多后台服务有自己的配置文件,并且配置文件格式都不相同,OpenWrt系统中需要开启各种服务,为了解决配置不兼容的问题,统一采用uci格式的配置文件。…

macbook 双系统win7忘密码 解决办法 通用

1开机出现以下图片按开机键强制重启2选择这一个3跟着选择4等待时间较长5继续678点击计算机9选择c盘10选择Windows进入system32文件夹11右键修改名字 将sethc 修改为sethc112然后键盘上输入cmd13将cmd名字修改为sethc 14关掉所有点击完成 15然后开机来到登录界面 按5次shift 次数…

GoLang 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:GoLang 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 GoLang 补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! GoLang是JetBrains公司推出的一款功能强大的GO语言集成…

数值计算方法(3) 数值微分方法

+++ date = 2024-12-21T15:45:47+08:00 draft = true title = 数值计算方法(3) 数值微分方法 +++ 初次发布于我的个人文档 上一期讲了数值积分方法,这一次自然是要讲数值微分方法的,不然太不完善了。 更何况数值微分方法其实是基于数值积分方法得到的。 我们先从比较简单的估…

.Net NativeAOT另外一种选择-bflat

https://www.qiufengblog.com/articles/dotnet-native-bflat.html前言 说起bflat,还得先说NativeAOT,在.Net 7时,正式把NativeAOT合到Runtime中,地位是明显上升了,对NativeAOT的代码提交也越来越多了,之前还是corert时,几年也没有太大的进展. 这个时候的成果还是有ILC(ILCompil…

20241415 《计算机基础与程序设计》课程总结

20241415 《计算机基础与程序设计》课程总结 每周作业链接汇总 第一周作业 参考基于VirtualBox虚拟机安装Ubuntu图文教程安装Linux系统 自学计算机科学概论》并提出问题第二周作业 了解计算思维和计算机结构第三周作业 计算机的数据表示法 C语言的基本数据类型第四周作业 门电路…