Вопрос по c – Можно ли добиться максимальной производительности при создании статических переменных?

12

Почему некоторые люди делают:

<code>char baa(int x) {
    static char foo[] = " .. ";
    return foo[x ..];
}
</code>

вместо:

<code>char baa(int x) {
    char foo[] = " .. ";
    return foo[x ..];
}
</code>

выглядит очень распространенным в приложениях с исходными кодами Linux. Там разница в производительности? если да, может кто-нибудь объяснить, почему? Заранее спасибо.

Этот код не компилируется, указатель массива должен быть ПОСЛЕ имени переменной, а не перед ней. Richard J. Ross III

Ваш Ответ

5   ответов
2

что переменная не «освобождена», то есть она сохранит свое значение при последующих вызовах. Это может привести к улучшению производительности в зависимости от алгоритма, но, конечно, само по себе это не улучшение производительности.

12

per se, а скорее, чтобы уменьшить использование памяти. Тамis повышение производительности, но это (обычно) не основная причина, по которой вы видите подобный код.

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

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

3

static просто поместит строку куда-нибудь в память во время компиляции, тогда как версия безstatic заставит функцию (каждый раз, когда она вызывается) выделять некоторое пространство в стеке и записывать строку в это пространство.

Версия сstatic, следовательно,

is likely to be quicker may use less memory will use less stack space (which on some systems is a scarce resource) will play nicer with the cache (which isn't likely to be a big deal for a small string, but might be if foo is something bigger).
Вы имеете в виду первое, а не второе.
Почему да, я так и сделал. Благодарю. Я отредактировал свой ответ, чтобы он был (1) более четким и (2) правильным.
почему это сэкономит память? при загрузке функции все равно нужно стоить стековую память?
@dragonxlwang Takechar foo[] = "bar" противstatic char foo[] = "bar", Когда программа загружается в память,"bar" является частью исполняемого образа. Разница заключается в том, как это лечится.static указывает прямо на"bar" в загруженном исполняемом образе (который также объясняетstaticпобочные эффекты). не-static должен: (1) выделить достаточно места для стека"bar"и (2) копия"bar" из загруженной программы в это пространство стека наeach function call, Каждый звонок делает новую копиюall переменные стека в этой функции. Именно поэтому глубокая рекурсия может быстро исчерпать стек.
3

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

1

Firstly, the memory will be allocated in either bss or data segment instead of stack.

Secondly, it will be initialized for once only , not every time unlike other variables of function, which will surely create difference.

Thirdly, it retains it's value b/w function calls.So depending on the situations you should use it.

Похожие вопросы