"如果你不从Object继承会怎么样?没什么可怕的。这些类将稍微更轻量级,但是,它们将缺少某些功能,例如属性更改通知,并且您的对象不具有公共基类。通常继承自Object就是你想要的。" Vala team said
所以我想知道类有没有继承形式对象有多么轻松。
所以,这是我的测试文件
test1.vala:
class Aaaa : Object {
public Aaaa () { print ("hello\n"); }
}
void main () { new Aaaa (); }
test2.vala:
class Aaaa {
public Aaaa () { print ("hello\n"); }
}
void main () { new Aaaa (); }
编译后的结果完全出乎意料,test1的大小为9.3 kb,test2的大小为14.9 kb,这与他们所说的相矛盾。有人可以解释一下吗?
答案 0 :(得分:2)
您正在比较生成的对象代码/可执行文件大小,但这不是教程中的语句所指的内容。
它指的是您的班级将支持的功能。它只是说明您没有获得GLib.Object
/ GObject
提供的所有功能。
在C#中(在Java中也是如此?)类型系统是“rooted”,这意味着所有类总是从System.Object
隐式派生。对于Vala来说情况并非如此。 Vala类可以是“独立”类,这意味着这些独立类没有任何父类(甚至不是GLib.Object
/ GObject
)。
代码大小更大,因为独立类不重用GLib.Object
/ GObject
(在glib中实现)的任何功能,因此编译器必须输出更多的样板代码(在C中编写类总是涉及很多锅炉板代码)。
您可以将自己与“valac -C yourfile.vala”进行比较,后者将生成“yourfile.c”文件。
答案 1 :(得分:1)
这是一个非常有趣的问题。答案将让您深入了解GObject的工作原理。对于这些类型的问题,valac
的一个有用功能是使用--ccode
开关。这将生成C代码,而不是二进制代码。如果您查看第二个代码示例的C代码,它不会从Object
继承,它会包含更多函数,例如aaaa_ref
和aaaa_unref
。这些是用于处理GLib对象系统中的对象的基本函数。当您从Object
继承时,这些函数已在父类中定义,因此C代码和生成的二进制文件更小。
只使用class
而不继承自Object
,您正在创建自己的GType
,但不会继承Object
的所有功能,因此从这个意义上说,您的课程更轻松重量。这使得它们更快地实例化。如果您计算与相同数量的GType
继承对象相比创建大量GObject
个对象所需的时间,您应该会更快地看到GType
对象的创建。正如您所指出的,GType
对象会丢失一些额外的功能。因此,选择取决于您的申请。