Vala 物体 class 比正常 class 轻
Vala object class lighter than normal class
"What happens if you don't inherit from Object? Nothing terrible. These classes will be slightly more lightweight, however, they will lack some features such as property change notifications, and your objects won't have a common base class. Usually inheriting from Object is what you want." Vala team said.
所以我想知道 类 在继承或不继承 Object 形式的情况下有多轻。
所以,这是我的测试文件
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.3kb,test2的大小为14.9kb,与他们所说的相矛盾。有人可以解释一下吗?
您正在比较生成的目标代码/可执行文件的大小,但这不是教程中的陈述所指的内容。
它指的是您的 class 将支持的功能。这只是澄清您没有获得 GLib.Object
/ GObject
提供的所有功能。
在 C# 中(在 Java 中也是如此?)类型系统是 "rooted",这意味着所有 classes 总是从 System.Object
隐式派生。 Vala 的情况并非如此。 Vala classes 可以是 "stand alone" classes 这意味着这些独立的 classes 没有任何父 class(甚至 GLib.Object
/ GObject
).
代码量较大,因为独立 class 不重用 GLib.Object
/ GObject
中的任何功能(在 glib 中实现),因此编译器具有输出更多样板代码(在 C 中编写 classes 总是涉及很多样板代码)。
您可以将自己与 "valac -C yourfile.vala" 进行比较,后者将生成 "yourfile.c" 文件。
这是一个非常有趣的问题。答案将使您深入了解 GObjects 的工作原理。对于这类问题,valac
的一个有用功能是使用 --ccode
开关。这将生成 C 代码,而不是二进制文件。如果您查看第二个代码示例的 C 代码,它没有继承自 Object
,它包含更多函数,例如 aaaa_ref
和 aaaa_unref
。这些是用于处理 GLib 对象系统中对象的基本函数。当您从 Object
继承时,这些函数已经在父 class 中定义,因此 C 代码和生成的二进制文件更小。
通过仅使用 class
而不继承 Object
,您正在创建自己的 GType
,但并未继承 Object
的所有功能,因此从这个意义上说,您的 classes 重量更轻。这使它们可以更快地实例化。如果你计算一下创建大量 GType
对象与相同数量的 GObject
继承对象相比需要多长时间,你应该会看到 GType
对象的创建速度更快。正如您所指出的 GType
对象失去了一些额外的功能。所以选择取决于你的应用程序。
"What happens if you don't inherit from Object? Nothing terrible. These classes will be slightly more lightweight, however, they will lack some features such as property change notifications, and your objects won't have a common base class. Usually inheriting from Object is what you want." Vala team said.
所以我想知道 类 在继承或不继承 Object 形式的情况下有多轻。
所以,这是我的测试文件
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.3kb,test2的大小为14.9kb,与他们所说的相矛盾。有人可以解释一下吗?
您正在比较生成的目标代码/可执行文件的大小,但这不是教程中的陈述所指的内容。
它指的是您的 class 将支持的功能。这只是澄清您没有获得 GLib.Object
/ GObject
提供的所有功能。
在 C# 中(在 Java 中也是如此?)类型系统是 "rooted",这意味着所有 classes 总是从 System.Object
隐式派生。 Vala 的情况并非如此。 Vala classes 可以是 "stand alone" classes 这意味着这些独立的 classes 没有任何父 class(甚至 GLib.Object
/ GObject
).
代码量较大,因为独立 class 不重用 GLib.Object
/ GObject
中的任何功能(在 glib 中实现),因此编译器具有输出更多样板代码(在 C 中编写 classes 总是涉及很多样板代码)。
您可以将自己与 "valac -C yourfile.vala" 进行比较,后者将生成 "yourfile.c" 文件。
这是一个非常有趣的问题。答案将使您深入了解 GObjects 的工作原理。对于这类问题,valac
的一个有用功能是使用 --ccode
开关。这将生成 C 代码,而不是二进制文件。如果您查看第二个代码示例的 C 代码,它没有继承自 Object
,它包含更多函数,例如 aaaa_ref
和 aaaa_unref
。这些是用于处理 GLib 对象系统中对象的基本函数。当您从 Object
继承时,这些函数已经在父 class 中定义,因此 C 代码和生成的二进制文件更小。
通过仅使用 class
而不继承 Object
,您正在创建自己的 GType
,但并未继承 Object
的所有功能,因此从这个意义上说,您的 classes 重量更轻。这使它们可以更快地实例化。如果你计算一下创建大量 GType
对象与相同数量的 GObject
继承对象相比需要多长时间,你应该会看到 GType
对象的创建速度更快。正如您所指出的 GType
对象失去了一些额外的功能。所以选择取决于你的应用程序。