c++ 中“内存”问题
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。他们分别到是指内存条还是CPU中的内存?c++类的成员函数没有在堆栈中分配,而是直接用了代码段。这代码段存储在哪里?
“String temp(s1 + s2);return temp;
上述代码将发生三件事。首先,temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;”中外部存储单元外部存储单元指的是什么?
追问:谢谢回答,你的回答好像是某个网站上的,呵呵,谢谢你拉
答案:有的人回答有词不准确。CPU存储元件——缓存、寄存器
一、堆、栈、自由存储区、全局/静态存储区和常量存储区?
这都是指内存RAM,CPU的容量小(由寄存器组)不够存放所有程序所需数据,他只够存放当前运行的变量。为什么CPU小,而内存大能够存放那么多数据?一个很简单的问题,如果CPU也有内存那么大的话,计算机就不需要内存了,说穿了就是微电子上物理知识,容量越小的元件速度越快,搞软件的没必要深究。至于缓存是CPU访问内存时,其速度就靠缓存来解决,所以CPU访问内存是一种折中选择。
寄存器>内存>硬盘 他们的速度都是由缓存来解决,相反越慢容量越大
二、c++类的成员函数没有在堆栈中分配,而是直接用了代码段。这代码段存储在哪里?
答:代码是存放在代码区。
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 。
5、程序代码区—存放函数体的二进制代码。
你说的其实都是指虚拟的内存,并不是实际的内存也不是CPU中的内存,CPU是没有内存说的,一般CPU存储数据我们说寄存器,数据存储在CPU中只有在当前线程获取CPU执行权的时候,才能把数据存储在CPU“内存”中(c++中有个关键字可以用于建议将变量对应的数据存储在CPU中,但只是建议,采纳不采纳取决于当前CPU)
一个程序在你编译后市PE格式,当加载到内存后,它的内存组织数据时分三块的:
代码块(文本区),数据块(存储全局或静态或其他变量),堆栈(只是两个概念,两个东西)
所谓的代码段就是我们的文本区(一种称呼而已),它是存在于进程的地址空间中的,当执行的时候该代码将提交给物理内存并获取CPU执行
c++类的成员函数没有在堆栈中分配那是不肯能的,函数的调用关系是通过堆栈来完成和体现的,只是你看不到而已但不代表不存在,如果你懂得调试可以自己调试下就知道了
=================
外部存储单元外部存储单元指的是什么?
指内存单元,temp返回的是个地址改地址指向一个真正对象的地址,你获取的temp仅仅是一个对象的引用
当然是内存,CPU有内存吗?
成员变量是在栈上的,由系统来管理内存(函数结束后会被回收)...
堆是有程序员来分配和管理的
内存就是内存条。
简单说
函数中开辟局部变量的内存是在栈中比如
int main() { int i = 0; return i;} // i局部变量再栈中开辟内存 函数结束释放内存
静态数据时用static定义的内存。
堆是用new和delete开辟和释放由程序员自己管理的内存。
void aa(){char *pc = "aaaa" };//“aaaa”是常量存储在常量存储区,但是指针pc是局部变量存储在栈中。
不明白加QQ
在编程的时候遇到的内存等术语,与指示电脑硬件时候的内存不是一个意思。
程序设计是建立在操作系统之上的,操作系统已经帮助程序员屏蔽了电脑硬件的所有问题。
所以,第一个人的回答是正确的。
内存,cpu中的是一部分高速缓存和寄存器,没有内存
上一个:C++,标准库头文件
下一个:用C++设计一个简单的计算器