| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> debug和release -> 正文阅读 |
|
[C++知识库]debug和release |
今天来聊一聊数据在内存中的储存方式,这些内容比较偏向底层,在c语言中简单讲解可以让大家更加了解编程。对于编程来说,我们所学的不应该是语言,过了十年,甚至二十年之后,可能在这样发展迅速的时代中,语言已经被淘汰,但是我们所学习的编程思想不会淘汰。 接下来开始今天的正题,来看下面的一段代码
这段代码非常简单,这段代码有明显的错误,越界访问了 在执行程序的国政中,vs2022直接报错,现在让我们了解一下报错的更加深层次的原因。 这个数组是作为一个局部变量储存在计算机的栈区(计算机的内存的一块区域),栈区通常是存放局部变量的 ?现在华哥图为大家进行更详细的解释 ?假设这个长方形计算机的储存空间,其中每一个小块都是计算机的储存单元,其中位于上方的地址的十六进制序列比较大,所以被称为高地址,而下方的序列比较小,也就被称作低地址。 局部变量是被创建于栈区上的,即当前的i和arr是储存于栈区。栈区的使用习惯是:先使用高地址,再使用低地址。所以再创建变量之后大概就是这样 ?数组随着下标的增长地址由低到高变化,所以再栈中数组的储存应该是这样的 ?看刚才那段代码,如果i=10,11的时候,就开始越界访问了 ?他就访问到下标为10,下标为11的位置,接下来我们将编译器调整成release版本 ? 再次运行,发现编译器并没有报错,这是因为?release版本是为程序做过优化的。这里我们再次深入了解一下release版本和debug版本的差别。 这里我们观察一下arr这个数组和变量i在计算机中储存的地址
?这是debug版本下的储存位置? ? 这是release版本下的储存位置? ?大家可以仔细观察一下,在release版本中i的地址是要小于arr所在的地址,这也就是release版本为程序所做的优化。也就是说,在栈中debug版本i是储存于arr的上方的,而在release版本中,i是存储于arr下方的。这样就算arr再怎么越界访问,也只会访问到高地址处,并不会覆盖到i。 debug其实是作为调试版本,它包含了调试信息,并且不会做任何优化,便于程序员的调试 release版本被称作发布版本,它通常及进行了各种优化,让程序在大小和速度上是最好的,方便于用户去使用 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/24 4:45:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |