Является ли более эффективным вызывать функции или заполнять контроль, если операторы с локальными переменными, а не непосредственно вкладывать вызов функции?

В C++ он дает более быстрый исполняемый файл, если вы предоставляете данные для сравнения в скобках if оператор как неявный результат вложенной функции вместо отдельной локальной переменной? Точно так же, эффективнее ли предоставлять аргумент функции в результате вызова вложенной функции, опять же, вместо отдельной локальной переменной?

Я имею в виду:

int comparison=0;
char *name=nullptr;

GetNameFromRegistry(queried_name);  //Unillustrated function that retrieves a name
                                    //entry from the Windows registry, dynamically
                                    //allocates a sufficiently-sized chunk of memory
                                    //to hold it and null-terminates the string.

comparison=strcmp(queried_name,"Fred");

if(comparison==0){
    MessageBox(NULL,
        "We have found Fred.",
        "Name Search", 
        MB_OK | MB_ICONINFORMATION);
}

в отличие от:

char *queried_name=nullptr;

GetNameFromRegistry(queried_name);  //Unillustrated function that retrieves a name
                                    //entry from the Windows registry, dynamically
                                    //allocates sufficiently-sized chunk of memory
                                    //to hold it and null-terminates the string.


if(strcmp(queried_name, "Fred")==0){
    MessageBox(NULL,
        "We have found Fred.",
        "Name Search",
        MB_OK | MB_ICONINFORMATION);
}

Другой пример:

CData gp_data;  //CData is a class that holds values, arrays and
                //volatile/non-volatilve data for a windows application, 
                //saving those non-volatile values to the registry to be
                //retrieved the next time it is launched.

SendMessage(dialog,
    WM_SETICON,
    reinterpret_cast<WPARAM>(ICON_SMALL),
    reinterpret_cast<LPARAM>(gp_data->Get_Small_Application_Icon()));

в отличие от:

HICON small_icon=0;
CData gp_data;  //CData is a class with holds values, arrays and volatile data for
                //a windows application, saving non-volatile values to the registry
                //to use the next time it is launched.

small_icon=gp_data->Get_Small_Application_Icon();

SendMessage(dialog,
    WM_SETICON,
    reinterpret_cast<WPARAM>(ICON_SMALL),
    reinterpret_cast<LPARAM>(small_icon));

Очевидно, что в первом примере первая форма требует, чтобы из стека выделялась дополнительная локальная переменная, но я лично считаю, что ее легче читать / отлаживать.

Опять же, во втором примере требуется дополнительная локальная переменная, которая, как мне кажется, еще легче прочитать. Тем не менее, может быть, выигрыш в производительности при первой форме компенсирует потерю читабельности?

2 ответа

Решение

Я нахожу второй лучше. Новая переменная не добавляет больше семантики в код. Это просто фиктивная переменная. Его имя, сравнение, ничего не говорит. Возможно, вы могли бы написать:

bool is_specific_name = strcmp(name,"Specific Name") == 0;

if (is_specific_name) {
...
}

По крайней мере, теперь переменная что-то говорит читателю. Может быть, кто-то незнакомый с strcmp это оценит. Хотя, если аудитория вашего кода - люди, знакомые с C, то они, вероятно, знают все о strcmp и, вероятно, оценят более короткий код.

Однако, если мы пишем C++, почему мы используем strcmp, а не сравнение строк? Зачем использовать массив символов C? Certanly

if (name == "Specific Name") {
...
}

будет самым семантическим из всех выражений. В этом случае дополнительная переменная кажется совершенно ненужной.

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

Умные компиляторы могут генерировать один и тот же двоичный код для обоих стилей. Так что вы можете сделать некоторые компиляции и разборки, чтобы подтвердить это, если вы действительно заинтересованы.

Другие вопросы по тегам