jat*_*893 4 c++ java oop compilation class
我理解如何为C程序(堆栈,堆,函数调用等)组织内存.现在,我真的不明白所有这些东西在面向对象语言中是如何工作的(更具体地说,C++).
我知道每当我使用new关键字时,对象的空间就会分配到堆上.
我的一些基本问题是:
1)在程序执行期间,类定义是否存储在内存中?
2)如果是,则存储在何处以及如何存储.如果不是,那么在运行时如何调度函数(在虚拟/非虚函数的情况下).
3)当一个对象被分配内存时,该对象的所有细节都存储在其中?(它属于哪个类,成员函数,公共私有变量/函数等)
所以基本上,有人可以解释在编译之后/期间如何转换面向对象的代码以便实现这些OOP功能吗?
我对Java/C++很满意.因此,您可以使用其中一种语言解释逻辑,因为两者都具有非常明显的特征.
此外,请添加任何参考链接,以便我也可以从那里阅读,以防万一有进一步的疑问!
谢谢!
1)在程序执行期间,类定义是否存储在内存中?
在C++中,没有.在Java中,是的.
2)如果是,则存储在何处以及如何存储.如果不是,那么在运行时如何调度函数(在虚拟/非虚函数的情况下).
在C++中,对非虚函数的调用被编译器替换为函数的实际静态地址; 对虚拟功能的调用通过虚拟表进行.new转换为内存分配(编译器知道精确的大小),然后调用(静态确定的)构造函数.编译器将字段访问转换为从对象的开头以静态已知的偏移量访问存储器.
它在Java中类似 - 特别是,虚拟表用于虚拟调用 - 除了可以象征性地进行字段访问.
3)当一个对象被分配内存时,该对象的所有细节都存储在其中?(它属于哪个类,成员函数,公共私有变量/函数等)
在C++中 - 没有存储元数据(除了RTTI所需的一些位之外).在Java中,您可以获得所有成员的类型信息和可见性以及其他一些内容 - 您可以查看Java类文件定义以获取更多信息.
所以基本上,有人可以解释在编译之后/期间如何转换面向对象的代码以便实现这些OOP功能吗?
从上面的答案可以看出,它实际上取决于语言.
在像C++这样的语言中,繁重的工作由编译器完成,并且生成的代码与面向对象的概念几乎没有关系 - 实际上,C++编译器(本机二进制代码)的典型目标语言是无类型的.
在像Java这样的语言中,编译器以中间表示为目标,该表示通常包含许多额外的细节 - 类型信息,成员可见性等.这也是在这些语言中进行反射的原因.