代码:
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);
}
但是使用这种方法,由于额外的函数调用,我有开销。
如何减少开销?
不会有任何。编译器会简单地内联你的函数。即使没有,与其他GUI开销相比,调用的开销加起来也绝对算不上什么。
为了便于论证,假设CPU每个周期可以执行一条指令。
假设你在一个运行速度只有1GHZ的旧的慢CPU上运行。假设它只有一个核心。
函数调用基本上包括将几个值推到堆栈上,跳到另一个位置,从堆栈中弹出几个值,并且,一旦函数完全完成,将返回值推到栈上(根据一些调用约定),然后跳回调用函数的位置。
让我们称之为10条指令。假设你的用户完全疯了,他每秒打开1000个InfoBox
。
这意味着您每秒浪费1000*10条指令=10000条指令。
CPU每秒可以运行1000000000条指令。这意味着您浪费了0.0001%的可用CPU时间。
这有什么好担心的吗?
这没有考虑编译器优化,这可能会将开销减少到一个很大的零。(函数调用很可能是内联的)。但在最坏的情况下,粗略估计是,如果用户不切实际地渴望显示InfoBox
es,那么在最坏情况下,您将浪费CPU执行时间的千分之一。
如果我理解正确,您可以使用默认参数的概念
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);