Какой из этих кодов лучше использовать и почему?
В первую очередь цитируемый код является в лучшем случае крошечной микро-оптимизацией. Не беспокойтесь о таких вещах, если вам это не нужно.
Фактически, это, скорее всего, диссоптимизация. Иногда в стеке выделяются автоматические переменные. Распределение стека чрезвычайно быстрое (и даже иногда свободное). Не нужно беспокоиться. В других случаях компилятор может поместить небольшую автоматическую переменную, такую как unsigned int
, которая используется здесь в регистре. Нет никакого распределения.
Сравните это с тем, чтобы сделать переменную членом данных класса и исключительно с целью избежать этого распределения. Доступ к этой переменной включает в себя прохождение указателя this
. Развертка указателя имеет стоимость, потенциально намного выше, чем при добавлении смещения к указателю. Разрыв может привести к промаху в кеше. Хуже того, это разыменование может быть выполнено каждый раз, когда на ссылку ссылается переменная.
При этом иногда лучше создавать элементы данных исключительно с целью избежать автоматических переменных в различных функциях-членах. Большие массивы, объявленные как локальные автоматические переменные, вполне могут привести к переполнению стека.Обратите внимание, однако, что создание double big_array[2000][2000]
, член данных MyClass
, скорее всего, сделает невозможным, чтобы переменная типа MyClass
была объявлена как локальная автоматическая переменная в некоторой функции.
Стандартное решение проблем, создаваемых путем размещения больших массивов в стеке, заключается в том, чтобы вместо этого распределить их по куче. Это приводит к тому, что создание элемента данных для избежания локальной переменной может быть полезным. Хотя распределение стека чрезвычайно быстрое, распределение кучи (например, new
) происходит довольно медленно. Функция-член, которая вызывается многократно, может выиграть, сделав автоматическую переменную std::unique_ptr<double> big_array = std::make_unique<double>(2000*2000)
членом данных MyClass
.
Обратите внимание, что ни одно из вышеизложенного не относится к образцу кода в вопросе. Обратите также внимание на то, что последнее беспокойство (создание переменной, распределенной по кучим, членом данных, чтобы избежать повторных распределений и освобождения) означает, что код должен пройти через указатель this
для доступа к этой памяти. В узком коде мне иногда приходилось создавать локальную переменную автоматического указателя, такую как double* local_pointer = this->some_pointer_member
, чтобы избежать повторных обходов через this
.
Всё зависит от меня. Вам нужна переменная 'currentTimeMS' где-нибудь еще? Где-то, где вы не можете напрямую называть 'getTimeMS'? –
В этом вопросе недостаточно кода или контента. Кроме того, ваше звание, серьезно? – juanchopanza
в первом фрагменте, является 'getTimeMS();' предполагается быть 'getTimeMS;'? – user463035818