0

代码:

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);
}

但是使用这种方法,由于额外的函数调用,我有开销。

我怎样才能减少开销?

4

3 回答 3

4

不会有的。编译器将简单地内联您的函数。即使没有,与其他 GUI 开销相比,调用的开销加起来也绝对没有。

于 2012-09-15T11:01:19.480 回答
3

为了论证起见,假设 CPU 每个周期可以执行一条指令。

假设您在一个运行速度仅为 1GHZ 的旧的、缓慢的 CPU 上运行。让我们假设它只有一个核心。

函数调用基本上包括将一些值压入堆栈,跳转到另一个位置,从堆栈中弹出一些值,并且一旦函数完成,将返回值压入堆栈(在某些调用约定下),以及跳回到调用函数的地方。

我们称之为 10 条指令。假设您的用户完全疯了,他InfoBox每秒打开 1000 个 es。

这意味着您每秒浪费 1000 * 10 条指令 = 10,000 条指令。

CPU 每秒可以运行 1,000,000,000 条指令。这意味着您浪费了 0.0001% 的可用 CPU 时间。

这有什么好担心的吗?

这没有考虑编译器优化,这可能会将开销减少到一个大的零。(函数调用很可能是内联的)。但在最坏的情况下,粗略的估计是,如果用户不切实际地渴望显示es ,那么在最坏的情况下,您浪费了 CPU 执行时间的千分之一。InfoBox

于 2012-09-15T11:05:10.417 回答
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);
于 2012-09-15T10:51:25.957 回答