Object 为什么编译器(比如javac)必须知道对象的大小?

Object 为什么编译器(比如javac)必须知道对象的大小?,object,compiler-construction,runtime,javac,.class-file,Object,Compiler Construction,Runtime,Javac,.class File,我想知道为什么编译器必须知道对象(类)的大小。我的意思是,当对象确实需要时,它不能推迟到运行时吗 谢谢,Javac不知道对象的大小。JVM抽象掉了这些细节 在C或C++等本机编译语言中,编译器必须知道对象的大小,当它包含在较大的结构中或当它在堆栈上分配时。*在堆分配的情况下,可以有一个动态大小的对象,尽管这是非常危险的,很难得到正确的。在C语言中,这通常是通过以空数组结束结构,然后分配额外的空间来完成的 锈实际上区分了已知大小和未知大小的类型。后者只能在有限的情况下使用。C/C++有一个类似的概

我想知道为什么编译器必须知道对象(类)的大小。我的意思是,当对象确实需要时,它不能推迟到运行时吗

谢谢,Javac不知道对象的大小。JVM抽象掉了这些细节

在C或C++等本机编译语言中,编译器必须知道对象的大小,当它包含在较大的结构中或当它在堆栈上分配时。*在堆分配的情况下,可以有一个动态大小的对象,尽管这是非常危险的,很难得到正确的。在C语言中,这通常是通过以空数组结束结构,然后分配额外的空间来完成的

锈实际上区分了已知大小和未知大小的类型。后者只能在有限的情况下使用。C/C++有一个类似的概念,即不完整类型,基本上只能用作不透明指针


*从技术上讲,C允许在堆栈上使用可变大小的数组

谢谢。所以你是说JVM在真正需要的时候(在运行时)正确地确定对象的大小,而不管这些对象是驻留在堆区域还是非堆区域,对吗?对于C++编译器,它是否有机会在运行时确定它(对于栈分配,至少在理论上)?@ ZGULSER JVM可以做任何想做的事情。实际上,对象的大小是由其类定义固定的(在运行时加载一次),并且所有对象都是堆分配的,除非可以对它们进行优化。数组有特殊的处理,明白了。那么数组是如何处理的呢?IIRC,堆栈上的可变大小数组是用C99添加到规范中的,但在您假设所有编译器都支持它之前,还需要一些时间。这可能被用作指示堆栈上未知大小对象相关困难的指标…