【问题标题】:Vala object class lighter than normal classVala 对象类比普通类轻
【发布时间】:2016-08-08 02:31:44
【问题描述】:

“如果你不从 Object 继承会发生什么?没什么可怕的。这些类会稍微轻一些,但是它们会缺少一些特性,例如属性更改通知,并且你的对象不会有一个通用的基类. 通常从 Object 继承是你想要的。 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.3 kb,test2的大小为14.9 kb,与他们所说的相矛盾。有人可以解释一下吗?

【问题讨论】:

    标签: vala


    【解决方案1】:

    您正在比较生成的目标代码/可执行文件大小,但这不是教程中的陈述所指的内容。

    它指的是您的班级将支持的功能。只是澄清你没有得到GLib.Object / GObject 提供的所有功能。

    在 C# 中(在 Java 中也是如此?)类型系统是“根”的,这意味着所有类总是隐式地派生自 System.Object。瓦拉的情况并非如此。 Vala 类可以是“独立”类,这意味着这些独立类没有任何父类(甚至没有 GLib.Object / GObject)。

    代码量更大,因为独立类没有重用来自GLib.Object/GObject的任何功能(在glib中实现),所以编译器必须输出更多样板代码(在C 总是涉及大量的样板代码。

    您可以将自己与“valac -C yourfile.vala”进行比较,后者将生成一个“yourfile.c”文件。

    【讨论】:

      【解决方案2】:

      这是一个非常有趣的问题。答案将使您深入了解 GObjects 的工作原理。对于这类问题,valac 的一个有用功能是使用--ccode 开关。这将生成 C 代码,而不是二进制文件。如果您查看第二个代码示例的 C 代码,它不是从 Object 继承的,它包含更多的函数,例如 aaaa_refaaaa_unref。这些是用于处理 GLib 对象系统中的对象的基本函数。当您从Object 继承时,这些函数已在父类中定义,因此 C 代码和生成的二进制文件更小。

      仅使用class 而不从Object 继承,您正在创建自己的GType,但没有继承Object 的所有功能,因此从这个意义上说,您的类更轻。这使它们可以更快地实例化。如果您计算创建大量GType 对象与相同数量的GObject 继承对象相比需要多长时间,您应该会看到GType 对象的创建速度更快。正如您所指出的,GType 对象失去了一些附加功能。所以选择取决于您的应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多