1:首先只是编译好的程序是以二进制的方式保存在硬盘上的,如exe,dll等。
2:程序运行时被加载解析到内存,这个时候变量保存就比较复杂了。
3:如果是全局变量和静态成员会被保存在数据段内。
4:变量不管是C#,C++ ,VB神马的,一般内成员变保存在栈中,如果成员变量是指针,那指针本身保存在SP寄存器中(堆栈指针寄存器)。指针成员指向的对象可能保存在堆栈中(普通如&int char等是在栈中,自定义类对象的话是在堆中)
5:当然数据保存可以人为用代码控制,汇编可以放入各种寄存器中,C++也做的到,然后就是系统本身会主动移动变量保存的位置,例如对一些运算频率高的变量代码等会被放入高速缓冲寄存器中。当然这个要看系统自己处理了。
6:C#中的引用无非就是编译器和框架帮你处理指针了,安全些,本质和C C++神马的都一样的
也就是说一般的成员变量如class A{int i;}i会保存到栈中么?还有就是在内存代码区中怎么区分各个函数是属于哪个类?
@LiloT:你理解错了,一般的类对象,比如A是一个自定义类,在C++中
{
A a;
}
那么对象a就在栈中,他的成员变量也在栈中。如果是
{
A* a=new A();
}
那么就是堆中。而指针可能比较复杂。我不敢确定。
至于你说的怎么区分函数数哪个对类的,这个是有寻址的,代码段也是个段啊,肯定是有地址的。这个是this指针的事情了,你去看看C++编程思想这本书,网上有电子版本的。看完你全明白了
函数还有虚函数,普通函数应该是通过this指针偏移来找到,虚函数实际上是用一个新的指针来指向的。一个类如果定义了虚函数,你sizeof(A)会发现每多定义一个虚函数 类的对象大小就增加四个字节,其实就是多了一个指针。
@大芝麻: 我的意思是一个类不是被编译完了,然后装入内存,这个成员变量i会放在内存的什么位置?代码区还是栈区?