GObject vs C ++:GObj提供了哪些好处,以及它在速度/大小方面的比较?

时间:2011-11-05 14:01:38

标签: c++ gobject

它为面向对象语言(如C ++)提供了什么?或者没有它可以使用GTK +?

假设两个示例使用相同的编译器,对象的GObject实现在可执行文件的大小和速度方面是否与C ++的实现质量相似?或者是否存在一些权衡,GObject因其提供的额外功能而变慢?

3 个答案:

答案 0 :(得分:6)

GObject(有点像Windows世界中的COM)是一个设计时考虑了跨语言互操作性的C API。

这意味着你可以用支持调用C函数的任何语言使用 GObjects,但是这使得用非C语言编写GObject非常困难,这些语言可以从任何语言中真正重用(如果你在Python中写一个GObject派生类,每次你想在C)中使用这个类的对象时,你都必须嵌入一个Python解释器。

可以半自动化为许多语言创建绑定(例如,Python,Perl,JS等),这是GObject的优势之一。这说明了GObject提供的有些不透明的API,我承认,这很难彻底理解。

不幸的是,它也不适合C ++语言。 GObject与C ++类没有任何关系,即使 bindings 可用(Gtkmm),也不可能轻易地编写“继承自GObject”的C ++类并将其暴露给世界。你必须为此写C。

[世界需要的是C ++语言的某种扩展,它可以很容易地与GObject互操作,有点像Windows上的C ++ Cx,但是1)这是一项艰巨的任务,也许可以通过GCC插件实现,2)在Gnome世界中,或者通常在Linux世界中没有C ++的动力(KDE是一个值得注意的例外)。目前我们仍然坚持使用Gtkmm绑定。]

答案 1 :(得分:1)

来自维基百科的关于GObject的文章包括comparison with C++。他们提到的一些事情是缺乏多重继承和信号的存在。此外,GObject受益于以下事实:与C ++不同,导出的C函数的名称不依赖于您选择的编译器。因此,如果您使用GObject开发面向对象的库,那么链接可能比使用C ++更容易。

查看面向GObject的Vala编程语言也很有趣。

答案 2 :(得分:0)

对弗拉德暗示的事情稍作阐述:支持C的一个主要观点是它使编译器或语言之间的可互操作性成为可能' (保证),因为它标准化ABI。这(请原谅我,如果我过度简化)可以保证来自任何C编译器或其他语言的调用者如何使用导出的符号。因此,为什么GTK +绑定到各种其他语言 - 包括GTKmm中的C ++。后者是两个世界中最好的恕我直言:GTK +的成熟API,但具有C ++的语言功能。

C ++目前还没有官方标准ABI,尽管还没有丢失,因为A-Team正在研究它:https://isocpp.org/files/papers/n4028.pdf