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 がサイクルごとに 1 つの命令を実行できるとしましょう。

わずか 1GHZ で動作する古くて遅い CPU で実行しているとしましょう。また、コアが 1 つしかないとします。

関数呼び出しは基本的に、いくつかの値をスタックにプッシュし、別の場所にジャンプし、スタックからいくつかの値をポップし、関数が完了すると、戻り値をスタックにプッシュすることで構成されます (いくつかの呼び出し規則の下で)。関数が呼び出された場所に戻ります。

全体で 10 命令としましょう。あなたのユーザーが完全に正気ではなく、InfoBox毎秒 1000 es を開いているとしましょう。

つまり、1000 * 10 命令 = 1 秒あたり 10,000 命令を無駄にします。

CPU は毎秒 1,000,000,000 命令を実行できます。つまり、利用可能な CPU 時間の 0.0001% を浪費していることになります。

それは心配することですか?

そして、これはコンパイラの最適化を考慮に入れていません。これにより、おそらくオーバーヘッドが大幅にゼロになります。(関数呼び出しはインライン化される可能性が非常に高い)。しかし、最悪の場合、大まかな概算は、ユーザーがesの表示に非現実的な熱意を持っている場合、最悪の場合に CPU の実行時間の 1000 分の 1 パーセントを浪費していることです。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 に答える