Какой из этих двух способов написания этого кода будет более подходящим? - PullRequest
0 голосов
/ 16 октября 2010

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

void Test(const long double input){
 long double num=(6.0*input);
 long double num1=9.0;
 for (int i=0;i<5;i++)
  num1*=num;
 cout <<num1<<'\n';
}

void Test(long double input){
 long double num=(6.0*input);
 input=9.0;
 for (int i=0;i<5;i++)
  input*=num;
 cout <<input<<'\n';
}

Ответы [ 5 ]

3 голосов
/ 16 октября 2010

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

По стилистическим (то есть, удобочитаемым) причинам, однако, я предпочитаю первое, чтобы одна и та же переменная не использовалась для двух разных вещей:

void Test(const long double input){ 
 long double num=(6.0*input); 
 long double num1=9.0; 
 for (int i=0;i<5;i++) 
  num1*=num; 
 cout <<num1<<'\n'; 
}
2 голосов
/ 16 октября 2010

Вот так:

void Test(long double input)
{
    long double factor = 6.0 * input;
    long double result = 9.0;

    for (int i = 0; i < 5; ++i)
        result *= factor;

    cout << result << '\n';
}

Обратите внимание, что мы помещаем пробелы между вещами по той же причине, что weputspacesbetweenwords и присваиваем вещам осмысленные имена, так что это действительно читабельно ...

1 голос
/ 17 октября 2010

Вот так:

void Test(long double input)
{
    long double const factor = 6.0 * input;
    long double       result = 9.0 * pow(factor, 5);

    cout << result << '\n';
}

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

Одна переменная для одного использования.Попытка повторного использования переменных не имеет смысла.Компилятор даже не имеет понятия имен переменных.При необходимости он повторно использует слоты (обратите внимание, я использую термин слот: несколько переменных могут использовать один и тот же слот).

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

Самое главное в коде - не писать его, а поддерживать его.Таким образом, ваш код ДОЛЖЕН быть написан так, чтобы его было легко поддерживать следующему человеку (компания потратит гораздо больше на обслуживание, чем на разработку нового кода).Старая поговорка - написать свой код, зная, что сопровождающий - это убийство топора, которое знает, где вы живете.

1 голос
/ 16 октября 2010

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

Я предполагаю, что вы, скорее всего, обеспокоены производительностью - если это так, я бы просто написал небольшое приложение-обертку для вызова каждой функции N раз, а затем вывел бы относительное время, возможно исключая часть cout, чтобы избежать консоли I / O искажение результатов.

0 голосов
/ 16 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...