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那样的巨大EXES.那么使用内联函数还是值得使用普通函数呢?
注意:我的所有函数只占用一行或有时两行,并且不大,如示例中所示.
解决方法
您是否使用完全相同的编译器,相同的编译标志进行编译,并使应用程序具有完全相同的功能?
我的猜测是,它是一些一次性的库代码,用于支持以前未使用过的C功能.
但一如既往,不要猜测,衡量.
你有一个数据点.这并没有告诉你太多.
我们可以看到在所有情况下文件大小增加350%,或者我们可以看到固定的16kb开销.你需要找出它是什么.
所以获得更多的数据点.扩展您的应用程序.使其打开十个窗口而不是一个,或以其他方式添加额外的功能.在这种情况下,“你的”版本是它的三倍吗?或者它大16kb?还是介于两者之间?获取更多数据点,您将能够看到文件大小如何缩放.
但最有可能的是,你担心什么都没有,原因如下:
> C编译器将内联视为提示.您正在使编译器很容易内联函数,但决策依赖于编译器本身,并尝试使应用程序快速运行.如果文件大小开始失控,那将会降低代码速度,因此编译器会尝试针对较小的文件大小进行优化.>你正在看几千字节.在一个TB级的硬盘时代.如果这有可能成为问题,那么您应该能够在测试用例中激发该问题.如果你不能写一个导致文件大小增加超过16kb的测试,那么就不值得担心了.>如果文件大小确实成为问题,编译器通常具有“优化大小”标志.>大型可执行文件通常会获得它们的大小,因为它们包含大量数据和资源.代码本身很少出现问题(除非你完全使用模板元编程进行疯狂)