首页 新闻 会员 周边 捐助

C++类编译好后,成员变量存储在什么位置?代码区?

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-19 15:16

c# 怎么存储的呢?成员变量存储在什么位置?

LiloT的主页 LiloT | 初学一级 | 园豆:6
提问于:2013-08-18 15:34
< >
分享
最佳答案
0

1:首先只是编译好的程序是以二进制的方式保存在硬盘上的,如exe,dll等。

2:程序运行时被加载解析到内存,这个时候变量保存就比较复杂了。

3:如果是全局变量和静态成员会被保存在数据段内。

4:变量不管是C#,C++ ,VB神马的,一般内成员变保存在栈中,如果成员变量是指针,那指针本身保存在SP寄存器中(堆栈指针寄存器)。指针成员指向的对象可能保存在堆栈中(普通如&int char等是在栈中,自定义类对象的话是在堆中)

5:当然数据保存可以人为用代码控制,汇编可以放入各种寄存器中,C++也做的到,然后就是系统本身会主动移动变量保存的位置,例如对一些运算频率高的变量代码等会被放入高速缓冲寄存器中。当然这个要看系统自己处理了。

6:C#中的引用无非就是编译器和框架帮你处理指针了,安全些,本质和C C++神马的都一样的

收获园豆:10
大芝麻 | 初学一级 |园豆:4 | 2013-08-18 21:08

也就是说一般的成员变量如class A{int i;}i会保存到栈中么?还有就是在内存代码区中怎么区分各个函数是属于哪个类?

LiloT | 园豆:6 (初学一级) | 2013-08-20 10:49

@LiloT:你理解错了,一般的类对象,比如A是一个自定义类,在C++中

A a;

那么对象a就在栈中,他的成员变量也在栈中。如果是

   A* a=new A();

那么就是堆中。而指针可能比较复杂。我不敢确定。

至于你说的怎么区分函数数哪个对类的,这个是有寻址的,代码段也是个段啊,肯定是有地址的。这个是this指针的事情了,你去看看C++编程思想这本书,网上有电子版本的。看完你全明白了

大芝麻 | 园豆:4 (初学一级) | 2013-08-20 14:52

函数还有虚函数,普通函数应该是通过this指针偏移来找到,虚函数实际上是用一个新的指针来指向的。一个类如果定义了虚函数,你sizeof(A)会发现每多定义一个虚函数 类的对象大小就增加四个字节,其实就是多了一个指针。

大芝麻 | 园豆:4 (初学一级) | 2013-08-20 14:57

@大芝麻: 我的意思是一个类不是被编译完了,然后装入内存,这个成员变量i会放在内存的什么位置?代码区还是栈区?

LiloT | 园豆:6 (初学一级) | 2013-08-24 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册