LINUX.ORG.RU

Статические переменные в main()


0

0

Господа, подскажите, какой смысл определять локальные переменные внутри функции main() как статические?

Дело в том, что случайно наткнулся на следующий скриншот:

http://www.nedit.org/screenshots/Nedit-C.png

и увидел соответственно там строку:

static char* protectedKeywords[] = ...;

вот и возник соответствующий вопрос.

Спасибо.

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

vnp
()

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

int19h ★★★★
()

переменные объявляемые в main - первые претенденты на static ;-)
это чтобы они в стеке не болтались..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> переменные объявляемые в main - первые претенденты на static ;-)
> это чтобы они в стеке не болтались..

это вы что-то очень неправильное говорите.

так они будут болтаться в .data, чем лучше?

idle ★★★★★
()
Ответ на: комментарий от idle

.data это менее критичный ресурс памяти. стек - критически важен для приложений, к примеру в embeded приложениях его вечно нехватает.

К тому-же .data не копируется при создании LWP, так что упихнуть данных по максимуму туда - правильный подход, особенно для систем не поддерживающих copy-on-write. Да и для прочих весьма неплохо.

P.S. Кстати, интересно было-бы сравнить скорость создания тредов в зависимости от текущего (полного и используемого) объёма стека.

P.P.S. main() вообще-то должна быть очень короткой функцией

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> .data это менее критичный ресурс памяти. стек - критически важен
> для приложений, к примеру в embeded приложениях его вечно нехватает.

но мы ведь здесь о linux говорим, правда?

> К тому-же .data не копируется при создании LWP

ничего не копируется, в том числе и стек.

разумеется, стек далеко не всегда лучшее место для
данных, особенно больших, но утверждать что для main()
_всегда_ лучше держать их в .data слишком категорично.

idle ★★★★★
()
Ответ на: комментарий от idle

> но мы ведь здесь о linux говорим, правда?

насколько понимаю в треде идёт речь в основном о C

> _всегда_ лучше держать их в .data слишком категорично.

не передёргиваёте - "первый кандидат на static" не значит "всегда помещать в .data" ;-)

имелось в виду, что если в main() возникла необходимость завести переменную, то стоит подумать - na hua она там.. по хорошему main запукает последовательно инит, чтение аргументов, конфигов и основной функционал. Практически только вызовы прочих функций. Любая автоматическая переменная в main так и будет безцельно болтаться в стеке как хризонтема в проруби до exit.

Хотя это на вкус и цвет..

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.