C/C++内存布局——代码区、常量区、静态区(BSS段、Data段)

news2024/11/24 20:55:12

C/C++内存分区

在这里插入图片描述

在C/C++这种高级语言的层面看,一个程序的内存分区可以被分为:(从低地址到高地址)代码区、常量区、静态区(已初始化(BSS段)、未初始化(Data段))、堆区、共享区、栈区、内核空间

本文将介绍代码区、常量区、静态区的作用,以及静态区中BSS段与Data段的作用。

代码区

代码区顾名思义用于存放程序的代码。进程被加载到内存后,CPU读取的时候是在代码区找到每一个代码语句,再去其他区域找数据。

常量区

也称为文本区(text),用于存放各种字符串常量和数字常量,以及全局的常量数据。

const int g_i = 100;
int main()
{
	const char* str = "Hello";
	const int c_i = 200;
}

静态区

静态区分为BSS段和Data段。

BSS段

存储未主动初始化的全局变量和静态变量,包括编译器手动设置的零值初始化变量。

Data段

存储主动初始化的全局变量和静态变量。

定义字符串常量会占用程序大小吗?

先来看几个程序,可以体现常量字符串在内存占用的情况。g++编译后,通过size工具可以查看程序各个分区的大小,text代表常量区,Data和BSS分别位于静态区。

int main()
{
    return 0;
}
    text    data     bss     dec     hex filename
    1418     544       8    1970     7b2 ./a.out
    
在没有任何字符串常量的情况下的内存占用。


int main()
{
    const char* str = "0123456789";
    return 0;
}
    text    data     bss     dec     hex filename
    1445     544       8    1997     7cd ./a.out

定义了一个指向10个字符的字符串指针的内存占用。1445 - 1418 = 27, 一共多了27个字节。
其实27包括了 10个字符的字节 + 17 个不知道哪里来的(编译器优化、数据填充和对齐)


int main()
{
    const char* str = "0123456789";
    const char* str1 = "0123456789";
    return 0;
}
    text    data     bss     dec     hex filename
    1445     544       8    1997     7cd ./a.out
    
仍然是1445,因为这个字符串已经存储在text段了,所以后续定义的指针都可以指向这个地址。
无需再分配空间,因为text段的内容只可读不可写。
除非使用类似内存映射的机制,将可执行程序文件的内存映射到当前进程的虚拟地址空间便可修改。


int main()
{
    const char* str = "0123456789";
    const char* str1 = "012345678";
    return 0;
}
    text    data     bss     dec     hex filename
    1455     544       8    2007     7d7 ./a.out

奇怪的是,str1只有9个字符,但是text段却增长了10个字节?其实是因为末尾的\0。
并且可以验证得出:str1字符串不是str的子串,而是会分配一个新的字符串。
自此也解决问题:如果程序中定义了很多常量,如字符串,会不会增加程序的占用?
答案是会的。而单纯的宏定义不会,只有宏被使用了,替换后才会实例化字符串。

#define Hello "Hello"
int main()
{
    const char* str = "0123456789";
    const char* str1 = "012345678";
    return 0;
}
    text    data     bss     dec     hex filename
    1455     544       8    2007     7d7 ./a.out

#define Hello "Hello"
int main()
{
    const char* str = "0123456789";
    const char* str1 = "012345678";
    const char* strHello = Hello;
    return 0;
}
    text    data     bss     dec     hex filename
    1477     544       8    2029     7ed ./a.out
    
这里相比上面增加了22,其实是包括了 6 + 编译器因为优化而填充的字节数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

景区AR虚拟三维场景沉浸式体验成为新兴的营销手段

科技的迅速崛起正在改变我们的世界,旅游业也在这股浪潮中掀起了一场全新的变革。增强现实(AR)技术正成为旅行中的一股强大力量,通过增添趣味和交互性,为旅程注入了前所未有的活力。本文将带您深入了解AR如何为旅游带来全新的体验,…

Hystrix和Sentinel熔断降级设计理念

目录 1 基本介绍2 Hystrix信号量和线程池区别2.1 信号量模式2.2 线程池模式2.3 注意 3 Sentinel介绍 1 基本介绍 Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源…

Qt开发_调用OpenCV(3.4.7)设计完成人脸检测系统

一、前言 近年来,人脸识别技术得到了广泛的应用,它可以在各种场景中实现自动化的人脸检测和识别,例如安防监控、人脸解锁、人脸支付等。 该项目的目标是设计一个简单易用但功能强大的人脸检测系统,可以实时从摄像头采集视频,并对视频中的人脸进行准确的检测和框选。通过…

【论文阅读】WATSON:通过聚合上下文语义从审计日志中抽象出行为(NDSS-2021)

Zeng J, Chua Z L, Chen Y, et al. WATSON: Abstracting Behaviors from Audit Logs via Aggregation of Contextual Semantics[C]//NDSS. 2021. TC_e3 trace、攻击调查、TransE、 以信息流为边界提取子图,为子图提取行为表示,进一步聚类,分析…

leetcode 655. 输出二叉树(java)

输出二叉树 题目描述代码演示 题目描述 难度 - 中等 leetcode 655. 输出二叉树 给你一棵二叉树的根节点 root ,请你构造一个下标从 0 开始、大小为 m x n 的字符串矩阵 res ,用以表示树的 格式化布局 。构造此格式化布局矩阵需要遵循以下规则&#xff1a…

【报错】 Cannot create property ‘showColumn‘ on number ‘-1‘

1、报错原因: 代码如下: 报错是因为:this.findObject(this.option.column, "thirdId")是一个number ,没有.showColumn属性 2、修改代码 将其变成object属性就行了

智慧工厂的未来:数字孪生的多重应用

数字孪生技术在智慧工厂项目中具有广泛的应用,为生产制造提供了前所未有的机会和优势。下面将探讨数字孪生技术在智慧工厂项目中的多个应用场景。 数字孪生技术的首要应用之一是生产流程优化。通过将现实世界的工厂映射到数字孪生模型中,制造商可以模拟…

apex应用程序创建和对比

创建一个应用程序290,功能全不选展现出来的效果: 对比勾选了功能的应用程序少了很多内容 那看来该勾选还得勾选,删除之前的之后重新创建了一个应用程序290 自己跟着做应用 搜索栏下拉选择部门 在数据库使用sql语句查询,在数据库中…

文字转语音TTS bark SpeechT5 mms

bark GitHub - suno-ai/bark: 🔊 Text-Prompted Generative Audio Model microsoft SpeechT5 https://github.com/microsoft/SpeechT5 使用 SpeechT5 进行语音合成、识别和更多功能 - 掘金 Facebook mms https://github.com/facebookresearch/fairseq/tree/mai…

vue使用百度地图实现地点查询

效果 代码 首先在index.html中引入script&#xff1a; <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,initial-scal…

DC电源模块过压保护功能介绍

BOSHIDA DC电源模块过压保护功能介绍 DC电源模块&#xff08;也叫直流电源模块&#xff09;是一种常见的设备&#xff0c;它可以将交流电转换为直流电&#xff0c;用于供电给各种电子设备。DC电源模块通常具有多种保护功能&#xff0c;其中过压保护是其中一项重要的保护功能。…

Spring boot +Thymeleaf 本地图片加载失败(图片路径)的问题及解决方法

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 在Spring Boot应用程序中&#xff0c;有时候我们会遇到本地图片不…

前后端数据加密传输基于AES+RSA实现

前后端数据加密传输基于AESRSA实现 什么是AES和RSA AES AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;它的加密速度快&#xff0c;安全性也比较高&#xff0c;是目前广泛使用的加密算法之一。AES的密钥长度可以选择128位、192位和…

腾讯云新用户云服务器特惠价格表(2023年)

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为全球用户提供稳定、安全、高效的云计算服务。对于新用户而言&#xff0c;腾讯云提供了多种特惠的云服务器套餐&#xff0c;以满足不同用户的需求。 1、轻量应用服务器 腾讯云的轻量应用服务器提供了高性价比的解决…

Java 大文件排序

大文件排序 http://en.wikipedia.org/wiki/Merge_sort http://en.wikipedia.org/wiki/External_sorting 外排序 通常来说&#xff0c;外排序处理的数据不能一次装入内存&#xff0c;只能放在读写较慢的外存储器&#xff08;通常是硬盘&#xff09;上。 外排序通常采用的是…

Oracle数据库概念简介

1. 数据库 一般意义上的数据库包含两个部分 库&#xff1a;就是一个存储一堆文件的文件目录数据库管理系统&#xff1a;管理库的系统 2. DBMS 数据库管理系统 数据库管理系统(Database Management System)&#xff0c;是一种操纵和管理数据库的大型软件&#xff0c;用于建立…

vue中v-for循环数组使用方法中splice删除数组元素(每次都删掉点击的下面的一项)

总结&#xff1a;平常使用v-for的key都是使用index&#xff0c;这里vue官方文档也不推荐&#xff0c;这个时候就出问题了&#xff0c;我们需要key为唯一标识&#xff0c;这里我使用了时间戳&#xff08;new Date().getTime()&#xff09;处理比较复杂的情况&#xff0c; 本文章…

mac安装adobe需要注意的tips(含win+mac all安装包)

M2芯片只能安装2022年以后的&#xff08;包含2022年的&#xff09; 1、必须操作的开启“任何来源” “任何来源“设置&#xff0c;这是为了系统安全性&#xff0c;苹果希望所有的软件都从商店或是能验证的官方下载&#xff0c;导致默认不允许从第三方下载应用程序。macOS sie…

接口参数校验

方式一&#xff1a;使用hibernate-validator注解方式参数校验 类似的框架太多了。缺点&#xff1a;返回的提示信息顺序不太确定 文档&#xff1a;https://hibernate.org/validator/documentation/ 参考资料&#xff1a;https://blog.csdn.net/weixin_45080272/article/details…

C++二叉树

代码随想录 (programmercarl.com) 二叉树理论基础篇 #算法公开课 《代码随想录》算法视频公开课 (opens new window) 大纲如下&#xff1a; 说到二叉树&#xff0c;大家对于二叉树其实都很熟悉了&#xff0c;本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍&#xf…