Различные функции используют одну и ту же функцию, уменьшают накладные расходы

Код:

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

Другие решения

Предположим, что процессор может выполнять одну инструкцию за цикл.

Допустим, вы работаете на старом, медленном процессоре, который работает с частотой всего 1 ГГц. И давайте предположим, что он имеет только одно ядро.

Вызов функции в основном состоит из помещения нескольких значений в стек, перехода в другое место, выталкивания нескольких значений из стека и, когда функция полностью завершена, помещения возвращаемого значения в стек (в соответствии с некоторыми соглашениями о вызовах), и прыжок обратно туда, откуда была вызвана функция.

Давайте назовем это 10 инструкций в целом.
Допустим, ваш пользователь совершенно безумный, и он открывает 1000 InfoBoxэс каждую секунду.

Это означает, что вы тратите 1000 * 10 инструкций = 10000 инструкций в секунду.

Процессор может выполнять 1 000 000 000 инструкций каждую секунду. Это означает, что вы тратите 0,0001% доступного процессорного времени.

Это то, что беспокоиться?

И это без учета оптимизаций компилятора, что, вероятно, уменьшит накладные расходы до нуля. (Скорее всего, вызов функции будет встроенным). Но в худшем случае, грубым приближением является то, что вы тратите одну тысячную одного процента времени вашего процессора в худшем случае, если пользователь нереально стремится к отображению InfoBoxэс.

3

Если я правильно понимаю, вы можете использовать концепцию аргумента по умолчанию

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);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector