热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++内存到底3个区还是5个区,每个资料介绍不同?

如题,我查了很多资料,有些说分五种:堆、栈、自由存储区、全局静态存储区和常量存储区。详见:http:dev.yesky.com4602379960.shtml有些说分三种:
如题,我查了很多资料,
有些说分五种:
堆、栈、自由存储区、全局/静态存储区和常量存储区。详见:http://dev.yesky.com/460/2379960.shtml
有些说分三种:
  堆、栈和静态存储区 。  详见http://dev.yesky.com/105/2030105.shtml
林锐的《C++高质量编程》好像也是分三种。
还有的分四种:
代码区 全局数据区 堆区 栈区 。详见http://baike.baidu.com/view/536145.html?wtp=tt

请问 “代码区 ”到底怎么回事?几种分法有什么区别和联系?

10 个解决方案

#1


你的问法不对, C++只是编程语言, 内存是操作系统分配的.

代码区属于程序空间, 不能访问, 就象医生不能给自己治病一样

#2


对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区,动态数据区。
动态数据区一般就是 堆栈。
栈(stack)和堆(heap)是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。

#3


内存其实是不分区的.只是属性不同而己.

#4


说法不一啊,堆、栈、自由存储区、全局/静态存储区和常量存储区

你能区分哪些数据在这5个区就可以了。

#5


研究这个意义不大,不同编译器,可能行为不同,如果是VC的话,基本上如下:
代码区,是编译器生成的一个Exe区段,拥有可读和可执行属性,但是实际上如果不开DEP数据执行保护,所有的区段都是可执行的,当然包括栈。
所谓的栈区,低地址(小于Exe基地址),拥有可读写属性,Exe中没有对应的区段,系统加载DLL时自动生成,由于内存地址使用方式从大往小减,所以数量有限,尽量不要定义过大的数组变量。
所谓的堆区,就是malloc和new之类的内存所在区段,拥有可读写属性,Exe中没有对应的区段,系统加载DLL时自动生成,首先是利用栈区地址下面的区段,也是低地址,当用完了,会自动分配稍微高一点地址(大于Exe基地址)。
全局数据区,是编译器生成的一个Exe区段,拥有可读写属性。
常量区,是编译器生成的一个Exe区段,只有可读属性,比如char* s = "Hello World",这时候"Hello World"就在常量区,由于没有可写属性,所以修改内容会出错。

但是,所有区段的属性都可以通过VirtualProtect修改,所以到底怎么用,还是自己看着办吧。

#6


引用 2 楼 liu_ying_shan 的回复:
对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区,动态数据区。 
动态数据区一般就是 堆栈。 
栈(stack)和堆(heap)是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。

听了你的说法更迷惘啊,能说清楚点吗?

#7


OK, 又学到了一点,哈哈~~

#8


w_anthony 的水平真高。


就是想理解内存方面,看资料看了版本不一,迷惑而已。

#9


区分标准不一样,结果肯定不一样

#10


http://blog.pfan.cn/zhaoyg/35045.html那是根据是C语言还是C++语言来定义的。建议看下我给你的链接。

推荐阅读
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
author-avatar
yangaien
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有