IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C /C++ 中的堆栈使用 -> 正文阅读

[C++知识库]C /C++ 中的堆栈使用

一、c/c++的堆栈在那些地方使用

??????? 堆栈(即栈)的使用,通常用来存储局部变量和函数参数,函数调用后返回的地址。

??????? 注:注意堆栈和堆的概念,堆的使用,即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或 delete释放内存。

????????C 和 C++ 都大量使用堆栈。
通常,堆栈使用很明确的包含:
??? 【1】函数的返回地址。
??? 【2】必须保留的寄存器。
??? 【3】局部变量,包括局部数组、结构、联合,以及 C++ 中的类。
但有些堆栈的使用并不明显,如:
??? 【1】如果局部整数或浮点变量被溢出(即未分配给寄存器),则为它们分配堆栈内存。
??? 【2】结构通常分配给堆栈。 一个空间相当于 sizeof(struct)填充到多个字节被保留在堆栈上, 但是,编译器可能会尝试将结构分配给寄存器。
??? 【3】如果在编译时知道数组的大小,则编译器会在堆栈上分配内存。 同样,一个空间相当于 sizeof(array)填充到多个字节被保留在堆栈上。

??? 【4】一些优化可以引入新的临时变量来保存中间结果。 优化包括:公共表达消除、生存范围拆分和结构拆分。 编译器尝试将这些临时变量分配给寄存器。 如果没有,它会将它们溢出到堆栈中。
??? 【5】通常,低位处理器编译(16bit/T32)的代码比高位处理器编译(32bit/T32)的代码更多地使用堆栈。 因为高位处理编译器比低位的具有更多个寄存器。
?? 【6】某些编译器要求某些函数参数传递通过堆栈或寄存器,具体取决于它们的类型、大小和顺序。

二、c/c++的堆栈该如何使用

??????? 【1】操作系统负责分配应用程序的堆栈和堆。编译器也有责任,但主要依靠操作系统来完成。堆栈是有限的,而堆不是。因此,在堆上分配非固定大小的对象(通常是编译时大小未知的数组)是不错的选择,建议任何超过几个KB的内容通常最好放在堆中。

??????? 【2】能使用堆栈的优先使用堆栈,而非堆,基于堆栈的对象更容易跟踪何时抛出异常。当然,您可以使用一个智能指针,它可以是一个基于堆栈的包装器,用于一个基于堆的对象的原始指针。

??????? 【3】尽量编写只需要少量变量的小函数。

??????? 【4】尽量避免使用大型局部结构或数组。

??????? 【5】尽量通过使用替代算法来避免递归,尤其是递归函数还定义变量的情况。

??????? 【6】函数中每个点在任何给定时间使用的变量数量最小化。

三、c/c++的堆栈使用追踪优化

??????? 建议在调试时,手动追踪堆栈使用情况并作出优化:
??? ??????? 【1】利用编译器生成静态调用图,显示所有函数的信息,包括堆栈使用。
??? ??????? 【2】使用 .debug_frame来显示的 DWARF 信息进行追查。
??? ??????? 【3】使用--info=stack等编译指令列出所有全局符号的堆栈使用情况。
??? ??????? 【4】使用调试器在堆栈中的最后一个可用位置设置观察点,并查看观察点是否被命中。 ??????????? 【5】应用程序完成执行后,检查内存的堆栈空间以查看有多少已知值已被覆盖,有多少一使用部分有垃圾。
??????? ??? 【6】计算垃圾值的数量并乘以 sizeof(value), 给出它们的大小,以字节为单位。追踪其堆栈的大小是如何增长的,以字节为单位。
??? ??????? 【7】采用异常捕获设计,堆栈溢出到禁止区域,则会发生数据中止,就可能会被调试器捕获。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:08:17  更:2022-09-21 00:09:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:00:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码