C++的内存模型

turing-complete 2011-05-29 01:04:36
上网搜了之后,大部分说是五大区域:堆、栈、自由存储区、全局/静态存储区和常量存储区。

可是,对于const 变量在反汇编的时候发现,它只是存在栈区而已,没看到跟一般变量的区别。
难道仅仅是编译器强制变量不能修改,运行时则没有限制?如若这样,那不就没有常量区了?

请高手解决一下c++程序的内存划分,到底包括哪几部分及其分别用来存储什么样的变量。
...全文
2603 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
turing-complete 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 ahxnwubh1983 的回复:]
memory model不是指这个
[/Quote]
用错概念了,多指教啊
fwijqiut 2011-06-01
  • 打赏
  • 举报
回复
memory model不是指这个
ltb1209 2011-06-01
  • 打赏
  • 举报
回复
正在学习中
turing-complete 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 sd01101230 的回复:]
哦,受不了,你还是去看C++的书籍吧。。。。
[/Quote]
我们这样的人都是不看书学东西的?是不是你认为我们是做梦的时候学的。
xuxun 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 adlay 的回复:]
引用 5 楼 mougaidong 的回复:

引用 4 楼 adlay 的回复:
你定义在哪里的? 如果是函数内部当然是在栈上分配了。
const 不能修改确实只是编译期的,强制修改 const 变量的方法也有很多。


哦 定义在函数内,就是栈上了! 这个说法倒是很有道理。
这也就是说,定义的变量存储在什么区,先看作用域,再看生存周期?
是这么个顺序吧?


和作用域和……
[/Quote]

写的好,我这个不会C的人也看得基本明白了
赵4老师 2011-05-31
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
turing-complete 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 bornku 的回复:]
权威解释来自《C++程序设计语言》
[/Quote]
权威解释,只能来自你在实践中的经验
bornku 2011-05-31
  • 打赏
  • 举报
回复
权威解释来自《C++程序设计语言》
turing-complete 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 icekingson 的回复:]
LZ可以看看《C++应用程序性能优化》。然后就大概都明白了
[/Quote]

谢谢了,经过高手的解答,我已经明白了。
sd01101230 2011-05-31
  • 打赏
  • 举报
回复
看一遍没明白,继续看第二遍。
你不做逆向工程,就别反汇编了。
windows 下干活,顺便看看windows方面的书籍。
sd01101230 2011-05-31
  • 打赏
  • 举报
回复
哦,受不了,你还是去看C++的书籍吧。。。。
turing-complete 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 war3_fan 的回复:]
不太明白啊
[/Quote]

哪里不明白就说,我现在明白了,可以探讨一下。
turing-complete 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
[/Quote]

确实不能迷信回帖,这位老师给我们现身说法了。
大家看见没有?这就叫模板回帖。
War3_Fan 2011-05-31
  • 打赏
  • 举报
回复
不太明白啊
icekingson 2011-05-30
  • 打赏
  • 举报
回复
LZ可以看看《C++应用程序性能优化》。然后就大概都明白了
zhang3317 2011-05-30
  • 打赏
  • 举报
回复
turing-complete 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 amblue 的回复:]
所谓的常量区是字面常量!
例如:
const char * str = "hello!";
中的“hello!”
const 修饰的变量跟普通变量存储位置跟普通变量没有区别,只是在内存中有标志位说明是常量,
此例中const变量str分配在栈中
[/Quote]

此例中,str也不一定在栈区。存储位置有可能是有区别的,这就得看编译器了。
内存中没有标志位,放在常量区得时候,操作系统会知道这个地方不允许修改。
amblue 2011-05-30
  • 打赏
  • 举报
回复
所谓的常量区是字面常量!
例如:
const char * str = "hello!";
中的“hello!”
const 修饰的变量跟普通变量存储位置跟普通变量没有区别,只是在内存中有标志位说明是常量,
此例中const变量str分配在栈中
turing-complete 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 adlay 的回复:]
VC8 的源代码

C/C++ code

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
……
[/Quote]
非常感谢
turing-complete 2011-05-29
  • 打赏
  • 举报
回复
哦 好的,非常感谢。
加载更多回复(19)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧