C/C++内存分配——在linux下看内存管理

news/2024/7/20 14:34:49 标签: c++, c语言, 操作系统, linux, 内存管理

目录

  • 一、C/C++内存分配
  • 二、程序和进程
  • 三、查看内存分段
    • 3.1 创建文件
    • 3.2 编译文件
    • 3.3 查看内存
    • 3.4 修改

一、C/C++内存分配

C++内存分段:

  • 代码区—— .text,代码存放的区域
  • 常量存储区—— .data,包括了常量,不允许修改,否则发生段错误
  • 全局区/静态区—— .bss,也称为零段,全局变量和静态变量存储的区域,如果没有赋初值则初值为0.
  • —— 程序员可支配的区域,使用malloc、new定义的变量存储在此区域。
  • —— 包括了局部变量、函数等。

  对于C语言而言,初始化的全局变量放在.data段,而未初始化的全局变量放在.bss段。

二、程序和进程

  程序是静态的,运行起来就成为进程。比如一段代码main.c,你在里面定义了一堆局部变量、malloc开辟出了一些空间,但是在未运行的时候只有常量、全局/静态变量才需要开辟空间存储。因此定义在堆栈区的变量、函数等并不会占据程序的空间,但是如果程序有太多的全局变量,就会导致程序很大,运行很慢,所以不推荐使用太多的全局变量。
在这里插入图片描述
  将main.c编译链接后,生成可以执行文件,运行可执行文件就是一个进程了。进程将原程序的内容拷贝后,并增加了堆、栈共享内存(和其他进程共享的区域)。当然,因为链接不管是静态链接还是动态链接都有其他大量的信息和相关的内容,所以实际代码还有其他段。
在这里插入图片描述

三、查看内存分段

  在linux下,运行相应的指令可以轻松地看出内存的分区。

3.1 创建文件

输入指令:gedit text.c,在窗口中书写一段C语言代码。
在这里插入图片描述

3.2 编译文件

输入指令:gcc -c text.c编译文件后,通过ls可以看到生成了一个text.o文件
在这里插入图片描述

3.3 查看内存

输入指令:objdump -h text.o查看内存分区。由3.1可知,我们定义了一个初始化过后的全局int型变量len,发现.data段刚好是4个字节,也就是一个int型变量len
在这里插入图片描述

3.4 修改

gedit text.c
gcc -c text.c
objdump -h text.o

根据前面的三个步骤,添加一句新的代码printf(“hello\n”);后编译。
在这里插入图片描述
这时候查看内存,发现.rodata从0变为6。因为字符串"hello"存放在常量区,5个字节再加上’\n’刚好是6个字节。可见,.rodata是常量区,用于存放const修饰的常量或字符串。
在这里插入图片描述


http://www.niftyadmin.cn/n/767835.html

相关文章

力扣每日一题:706. 设计哈希映射

目录题目:706. 设计哈希映射示例提示解题思路解题代码解题感悟题目:706. 设计哈希映射 难度: 简单 题目: 不使用任何内建的哈希表库设计一个哈希映射(HashMap)。 实现 MyHashMap 类:&#xff…

力扣每日一题:206. 反转链表

目录题目:206. 反转链表示例进阶解题思路解题代码(1)迭代法(2)递归法解题感悟题目:206. 反转链表 难度: 简单 题目: 反转一个单链表。 示例 输入: 1->2->3->4->5-&g…

力扣每日一题:92. 反转链表 II

目录题目:92. 反转链表 II示例1示例2提示解题思路解题代码(1)暴力法(2)头插法一次遍历解题感悟题目:92. 反转链表 II 难度: 中等 题目: 给你单链表的头指针 head 和两个整数 left …

力扣每日一题:1603. 设计停车系统

目录题目:1603. 设计停车系统示例提示解题思路解题代码解题感悟题目:1603. 设计停车系统 难度: 简单 题目: 请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每…

力扣每日一题:150. 逆波兰表达式求值

目录题目:150. 逆波兰表达式求值说明示例1示例2示例3提示解题思路解题代码解题感悟题目:150. 逆波兰表达式求值 难度: 中等 题目: 根据逆波兰表示法,求表达式的值。 有效的算符包括 、-、*、/ 。每个运算对象可以是整…

C/C++:字符串和int等类型间的转换

目录一、string转intatoistrtolstoi二、int转stringitoato_string三、多功能转换stringstream在编写C/C代码时&#xff0c;经常遇到string转int的问题&#xff0c;在此写个博客来做记忆。 一、string转int atoi atoi是C语言的函数&#xff0c;头文件#include <stdlib.h>…

KMP算法:C/C++代码实现

目录前言关键代码参考文章前言 KMP算法是很经典且高效率的字符串匹配算法&#xff0c;时间复杂度O(mn)。而纯暴力的BF算法&#xff0c;时间复杂度为O(mn)。网上解析KMP算法的博客也很多&#xff0c;在后面推荐几个不错的博客理解其原理&#xff0c;在此只贴出代码。 关键 1.…

力扣每日一题:191. 位1的个数

目录题目&#xff1a;191. 位1的个数提示示例1示例2示例3提示进阶解题思路解题代码&#xff08;1&#xff09;循环二进制位&#xff08;2&#xff09;优化二进制位解题感悟题目&#xff1a;191. 位1的个数 难度&#xff1a; 简单 题目&#xff1a; 编写一个函数&#xff0c;输…