【发布时间】:2011-07-07 07:16:27
【问题描述】:
我最近开始制作 GTK+ 的 C++ 包装器(没什么特别的,只是将所有内容都包装到 C++ 类中以便于开发,供内部使用)并尽量减少已经缓慢的性能膨胀> Gtk+ 我几乎在所有地方都使用了内联函数。看看几个类函数...
class Widget : public Object
{
public: // A few sample functions. gwidget is the internal GTK+ widget.
void Show(void) { gtk_widget_show(GTK_WIDGET(gwidget)); }
void ShowNow(void) { gtk_widget_show_now(GTK_WIDGET(gwidget)); }
void Hide(void) { gtk_widget_hide(GTK_WIDGET(gwidget)); }
void ShowAll(void) { gtk_widget_show_all(GTK_WIDGET(gwidget)); }
public: // the internal Gtk+ widget.
GtkWidget* gwidget;
};
虽然几乎不存在性能膨胀并且启动时间和内存使用量完全相同,但文件大小却急剧增加。 C Gtk+ 示例窗口生成 6.5 kb 而使用我的包装器的示例窗口生成 22.5 kb. ,所以我需要一些建议。我应该继续使用内联函数吗?我希望我的应用程序高效,并且我可以在文件大小上做出一些妥协,即使使用我的包装器生成的 6.5 kb C GTK+ 程序像 400-500 kb强>但不是更多。我不希望我的包装器生成像 wxWidgets 或 MFC 这样的 HUGE EXES。那么使用内联函数值得还是我应该使用普通函数?
注意:我的所有函数只占用一行或有时两行,并且并不像您在示例中看到的那样大。
【问题讨论】:
-
你在这里比较什么......你说“一个 C Gtk+ 示例窗口生成 6.5 kb,而使用我的包装器的示例窗口生成 22.5 kb”......你不是在比较用编译的程序你是针对你的 C++ 版本的 C 编译器吗?因为更丰富的运行时环境、它的初始化、异常支持代码、标准库函数等将是一次性成本。您只能使用相同的基本程序工具/编译器/编译器标志进行有意义的比较,然后与/没有你的包装......
-
我正在使用 gnu g++(使用 MinGW)进行编译。所以两者都被视为 c++ 程序。 C GTK+ 示例窗口是指直接使用 c gtk+ 函数和宏制作的示例窗口。
-
如果内联函数只包含另一个函数调用(对
gtk_widget_show等),那么额外的大小可能是由其他原因引起的。但他们没有,他们也做GTK_WIDGET,这应该是微不足道的,但可能不是。检查发出的代码或预处理后但编译前的代码(gcc -E),查看对这些成员函数的内联调用是否实际上包含大量代码。 -
@Steve 你的意思是函数宏 GTK_WIDGET 也添加到我的内联函数中?我知道了。我会检查的
-
当 1) 你想要的东西已经存在并且正在积极开发中时,你为什么要这样做:gtkmm.org/en 和 2) GTK 被设计为不必手动包装,但能够生成绑定自动转换成其他语言!