Является ли более эффективным вызывать функции или заполнять контроль, если операторы с локальными переменными, а не непосредственно вкладывать вызов функции?
В 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") {
...
}
будет самым семантическим из всех выражений. В этом случае дополнительная переменная кажется совершенно ненужной.
Что касается производительности, оптимизирующий компилятор должен генерировать один и тот же код для обеих конструкций, учитывая, что вы нигде не используете переменную.
Умные компиляторы могут генерировать один и тот же двоичный код для обоих стилей. Так что вы можете сделать некоторые компиляции и разборки, чтобы подтвердить это, если вы действительно заинтересованы.