社区
C++ 语言
帖子详情
C++的内存模型
turing-complete
2011-05-29 01:04:36
上网搜了之后,大部分说是五大区域:堆、栈、自由存储区、全局/静态存储区和常量存储区。
可是,对于const 变量在反汇编的时候发现,它只是存在栈区而已,没看到跟一般变量的区别。
难道仅仅是编译器强制变量不能修改,运行时则没有限制?如若这样,那不就没有常量区了?
请高手解决一下c++程序的内存划分,到底包括哪几部分及其分别用来存储什么样的变量。
...全文
2603
41
打赏
收藏
C++的内存模型
上网搜了之后,大部分说是五大区域:堆、栈、自由存储区、全局/静态存储区和常量存储区。 可是,对于const 变量在反汇编的时候发现,它只是存在栈区而已,没看到跟一般变量的区别。 难道仅仅是编译器强制变量不能修改,运行时则没有限制?如若这样,那不就没有常量区了? 请高手解决一下c++程序的内存划分,到底包括哪几部分及其分别用来存储什么样的变量。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
传智播客
C++
课件
1.C语言与
C++
语言的区别与联系; 2.
C++
内存模型
,命名空间和数据类型; 3.
C++
函数,引用,内联函数,函数模板,函数重载; 4.面向对象编程(OOP),类和对象; 5.构造器,拷贝构造,析构,new/delete; 6.运算符重载;面向对象编程(OOP),封装; 7.面向对象编程(OOP)继承; 8.面向对象编程(OOP)友元; 9.面向对象编程(OOP)多态; 10.类模板; 11.类的转换,类与指针,输入输出流; 12.
C++
调试技巧,错误排查技巧;
C++
11标准与Boost库,STL库;
C++
内存模型
详解
一.C/
C++
内存模型
基本概念 1.两大分区:代码区和数据区 2.四大分区:代码区,全局区(全局/静态存储区),栈区,堆区 3.C语言分区:堆,栈,静态全局变量区,常量区 4.
C++
语言分区:堆、栈、自由存储区、全局/静态存储区、常量存储区(标准答案) 5.C/
C++
内存模型
根据生命周期的不同有三大区:即自由存储区(
C++
),动态区、静态区 6.代码虽然占内存,但不属于c/
c++
内存模型
的一部分 二.各分区实际内存结构 text段: 用于存放程序代码的区域, 编译时确定, 只读。更进一步讲是存放处理器的机器
C++
内存模型
C++
内存模型
C++
内存模型
一
C++
内存模型
线程与数据竞争 执行线程是程序中的控制流,它始于std::thread, std::async或其他以其他方式所做的顶层函数调用 任何线程都能潜在地访问程序中地任何对象(拥有自动或线程局部存储期地对象仍可为另一个线程通过指针或引用访问) 始终允许不同地执行线程同事访问不同地内存位置,而无冲突或同步要求 一个表达式的求值写入内存位置,而另一求值读或写同一内存位置时,称这些表达式冲突。拥有二个冲突求值的程序有数据竞争,除非 两个求值都在同一线程上,或同一信号处理函数中执行,或 两个冲突
C++
内存模型
简述
C++
内存管理机制
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章