【问题标题】:GObject vs C++: What benefits does GObj offer, and how does it compare in speed/size?GObject 与 C++:GObj 提供了哪些优势,以及它在速度/大小方面的比较?
【发布时间】:2011-12-22 16:00:00
【问题描述】:

它为 C++ 等面向对象的语言提供了什么?或者没有它就不能使用GTK+?

假设两个示例使用相同的编译器,就可执行文件的大小和速度而言,对象的GObject 实现是否具有与 C++ 相似的质量?或者,由于它提供的额外功能,GObject 的速度会变慢吗?

【问题讨论】:

    标签: c++ gobject


    【解决方案1】:

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

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

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

    不幸的是,它也不适合 C++ 语言。 GObjects 与 C++ 类没有微不足道的关系,即使 bindings 可用 (Gtkmm),也不可能轻松地编写“从 GObject 继承”的 C++ 类并将其公开。您必须为此编写 C。

    [世界需要的是对 C++ 语言的某种扩展,这将使与 GObject 的互操作变得容易,有点像 Windows 上的 C++Cx,但是 1) 这是一项艰巨的任务,也许可以通过 GCC 插件实现,并且 2) 在 Gnome 世界或一般在 Linux 世界(KDE 是一个明显的例外)中,没有向 C++ 发展的势头。现在我们被 Gtkmm 绑定卡住了。]

    【讨论】:

    • 在任何 OO 系统与另一个系统之间桥接时存在“胶水问题”,无论原始语言如何(是的,有些库比其他库更好)。随着版本的变化,必须维护像 SWIG 这样的存根生成器。即使有了 LLVM 的 vmkit 项目,世界上还远没有任何类型的对象系统标准化。如果不是努力工作,那不值得得到体面的工资来工作,那会吗? :-)
    • 为什么自动绑定创建不能像使用其他语言(如 Python、Vala、Javascript)那样使用 C++?
    • @fr33domlover:因为在这些动态语言中,绑定是在运行时完成的。为 C++ 编译器提供相关信息以生成胶水代码很困难。
    • Vala 是一种具有编译时绑定的静态类型语言。理论上,您可以从 GObject Introspection 数据生成 C++ 绑定,但 glibmm 比 GI 更老,这样做可能需要 API/ABI 中断。
    【解决方案2】:

    Wikipedia 上关于 GObject 的文章包括 comparison with C++。他们提到的一些事情是缺乏多重继承和信号的存在。此外,与 C++ 不同,导出的 C 函数的名称不依赖于您选择的编译器,这让 GObject 受益匪浅。因此,如果您要使用 GObject 开发一个面向对象的库,它可能比 C++ 更容易链接。

    看看Vala 编程语言也会很有趣,它以 GObject 为目标。

    【讨论】:

      【解决方案3】:

      对 Vlad 所暗示的内容稍作阐述:支持 C 的一个主要观点是,它使编译器或语言之间的互操作性成为“可能”(保证),因为它标准化了 ABI。这(如果我过于简单化,请原谅我)可以保证来自任何 C 编译器或其他语言的调用者如何使用导出的符号。因此,为什么 GTK+ 绑定到各种其他语言——包括 GTKmm 中的 C++。后者是两全其美的恕我直言:GTK+ 完善的 API,但具有 C++ 的语言特性。

      C++ 还没有正式的标准 ABI,但一切都还没有丢失,因为 A 团队正在努力:https://isocpp.org/files/papers/n4028.pdf

      【讨论】:

        猜你喜欢
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        • 2013-09-03
        • 2010-11-19
        • 1970-01-01
        • 2018-10-26
        • 2013-09-22
        • 2012-05-17
        相关资源
        最近更新 更多