Это утверждение имеет или не имеет смысла в зависимости от того, как вы его акцентируете:
Чтение 1:
Преимущество статических данных заключается в том, что их можно инициализировать до желаемых значенийдо запуска программы.Недостатком является то, что пространство памяти занято на протяжении всего выполнения программы, даже если переменная используется только в небольшой части программы.
Все вышеперечисленное делает кеширование данных менее эффективным.
Это нонсенс.
Чтение 2:
ПреимуществоСтатические данные - это то, что они могут быть инициализированы до желаемых значений до запуска программы.
Недостатком является то, что пространство памяти занимает все время выполнения программы ...
... даже если переменная используется только в небольшой части программы.В одном случае это может сделать кэширование данных менее эффективным.
В этом случае статической переменной было выделено хранилище либо на странице, которая не всегда выгружается, либо находится в кэше.линия, которая редко используется иначе.Вы можете столкнуться с пропуском кеша или теоретически в худшем случае с ошибкой страницы (хотя, честно говоря, с количеством физической памяти, имеющимся в нашем распоряжении в наши дни, если это произойдет, у вас будут большие проблемы).
В конкретном случаеЕсли вы продемонстрируете, ответ будет «это зависит».
Да, инициализация static_arr
является одноразовой операцией, поэтому ее можно рассматривать как бесплатную.
Да, инициализация local_arr
происходит каждый раз, когда функциявызывается, но может быть так:
- эта инициализация тривиальна, или
- инициализация пропускается компилятором как часть прохода оптимизатора
В общем, если вы не имеете в виду конкретную оптимизацию, лучше (tm) написать код, в котором явно указано желаемое поведение , то есть:
использовать статические переменные (переменные со статической продолжительностью хранения), когда значение (я) переменной / массива должно выдерживать последовательные вызовы функции.
использовать локальные переменные (строго, переменные с автоматическимдлительность хранения), когда существующие значения не имеют смысла при входе или выходе из функции.
Вы обнаружите, что компилятор почти во всех случаях делает наиболее эффективную вещь:После прохода (ов) оптимизации.
Существует особый случай, когда статическая инициализация лучше (tm).В случае, скажем, буфера, который требует динамического выделения.Возможно, вы не захотите нести расходы по распределению / освобождению при каждом вызове.Возможно, вы захотите, чтобы буфер динамически увеличивался при необходимости, и оставался на том основании, что будущим операциям вполне может понадобиться память снова.
В этом случае фактическим состоянием переменной является размер выделенного буфера.,Таким образом, состояние важно при входе и выходе функции, например:
std::string const& to_string(json const& json_object)
{
static thread_local buffer; // thread-safe, auto-expanding buffer storage
buffer.clear(); // does not release memory
serialise_to_string(buffer, json_object); // may allocate memory occasionally
return buffer;
}