Вопрос по c – Можно ли добиться максимальной производительности при создании статических переменных?
Почему некоторые люди делают:
<code>char baa(int x) { static char foo[] = " .. "; return foo[x ..]; } </code>
вместо:
<code>char baa(int x) { char foo[] = " .. "; return foo[x ..]; } </code>
выглядит очень распространенным в приложениях с исходными кодами Linux. Там разница в производительности? если да, может кто-нибудь объяснить, почему? Заранее спасибо.
per se, а скорее, чтобы уменьшить использование памяти. Тамis повышение производительности, но это (обычно) не основная причина, по которой вы видите подобный код.
Переменные в функции размещаются в стеке, они резервируются и удаляются при каждом вызове функции, и, что важно, они будут учитываться в пределе размера стека, что является серьезным ограничением для многих встроенных и ограниченных по ресурсам платформ.
Однако статические переменные хранятся либо в.BSS
или же.DATA
сегмент (неинициализированные явным образом статические переменные перейдут в.BSS
статически инициализированные статические переменные перейдут в.DATA
), со стека. Компилятор также может воспользоваться этим для выполнения определенных оптимизаций.
static
просто поместит строку куда-нибудь в память во время компиляции, тогда как версия безstatic
заставит функцию (каждый раз, когда она вызывается) выделять некоторое пространство в стеке и записывать строку в это пространство.
Версия сstatic
, следовательно,
foo
is something bigger).
char foo[] = "bar"
противstatic char foo[] = "bar"
, Когда программа загружается в память,"bar"
является частью исполняемого образа. Разница заключается в том, как это лечится.static
указывает прямо на"bar"
в загруженном исполняемом образе (который также объясняетstatic
побочные эффекты). не-static
должен: (1) выделить достаточно места для стека"bar"
и (2) копия"bar"
из загруженной программы в это пространство стека наeach function call, Каждый звонок делает новую копиюall переменные стека в этой функции. Именно поэтому глубокая рекурсия может быстро исчерпать стек.
в отличие от переменных в автоматическом хранилище, которые инициализируются каждый раз, статические переменные инициализируются только один раз, при первом запуске функции. Еслиfoo
являетсяnot написано, что других отличий нет. Если оно записано, изменения статических переменных сохраняются между вызовами, а изменения автоматических переменных теряются в следующий раз через функцию.
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.