代码:
namespace Dialog {
enum class Type {Info, Warning, Error};
enum class Buttons {OK, OK_CANCEL, YES_NO, YES_NO_CANCEL};
void Box(Pane* parent, Core::String, Core::String, Buttons, Type);
}
我可以像这样定义InfoBox:
void InfoBox(Core::String title, Core::String text, Buttons b) {
Box(nullptr, title, text, b, Type::Info);
}
但是这种方法由于额外的函数调用而导致开销。
如何减少开销?
答案 0 :(得分:4)
不会有任何。编译器将简单地内联您的函数。即使它没有,与其他GUI开销相比,调用的开销也绝不会增加。
答案 1 :(得分:3)
为了论证,假设CPU每个周期可以执行一条指令。
假设您运行的是一台老式的慢速CPU,运行频率仅为1GHZ。我们假设它只有一个核心。
函数调用基本上包括将一些值压入堆栈,跳转到另一个位置,从堆栈中弹出一些值,一旦函数完全,将返回值推送到堆栈上(在一些调用约定下) ),并跳回到调用函数的位置。
让我们整体称它为10条指令。
假设您的用户完全彻底疯了,他每秒都会打开1000 InfoBox
个。
这意味着您每秒浪费1000 * 10条指令= 10,000条指令。
CPU每秒可以运行1,000,000,000条指令。这意味着你浪费了0.0001%的可用CPU时间。
这有什么值得担心的吗?
这不需要考虑编译器优化,这可能会减少开销,以及大量的零。 (函数调用很可能是内联的)。但在最糟糕的情况下,粗略的近似是,如果用户不切实际地渴望显示InfoBox
,那么在最糟糕的情况下,你浪费千分之一的CPU执行时间的百分之一 ES。
答案 2 :(得分:0)
如果我理解你是正确的,你可以使用默认参数的概念
void InfoBox(Core::String title="Hello", Core::String text="Info", Buttons b=Buttons::OK,Type typ=Type::Info) {
Box(nullptr, title, text, b, Type::Info);
}
或者,
void Box(Pane* parent=0, Core::String title="Hello", Core::String text="Info", Buttons b=Buttons::OK,Type typ=Type::Info);
然后你的电话将来自
InfoBox();
InfoBox("Hi");
InfoBox("Hi","Welcome");
InfoBox("Hi","Welcome",b=Buttons::OK_CANCEL);
InfoBox("Hi","Welcome",b=Buttons::OK_CANCEL,Type::Warning);