[C] static переменная в __inline функции

sergey_m

Будет одна копия этой переменной или столько, сколько раз заинлайнена функция?

ppplva

одна

sergey_m

Действительно.

bleyman

Было бы странно, если бы директива оптимизатора влияла бы на семантику слова static. Причём это было бы в стандарте (раз ты компилятор не указал).

bobby

оо, знаешь, сколько странных вещей бывает?

rosali

__inline управляет не оптимизатором, а линковщиком. Оптимизатор может inline-ить все что ему вздумается...

sevast82

__inline управляет не оптимизатором, а линковщиком
А можно пояснить эти слова?

vall

всегда думал что inline действует только в пределах одного модуля и занимается этим именно какой-то пасс отимизатора.

rosali

Бывают функции, тела которых определены прямо в хедерах. Тем самым у функции есть шанс попасть в разные .o файлы. и чтобы при линковке не было multiple definition, при таких функциях надо ставить inline. Никакого другого смысла современные компиляторы слову inline не придают. Также как например компиляторы давно уже не обращают внимания на слово register. Управление оптимизатором на таком уровне это прошлый век.
Я про C++ говорю, но думаю в чистом C все точно так же.

sevast82

Спасибо.
Да, действительно, например, в glibc любят аццы наопределять функций в хедерах.
Меня заинтересовали твои слова потому, что некоторое время назад я уже задавался вопросом, существуют ли линкеры, которые умеют делать инлайнинг?
Кстати, здесь такой вопрос задавал.
Так ничего и не нарыл на эту тему.
А подход, который ты описал - это же фактически костыль, который эмулирует именно функциональность инлайнинга на уровне линкера, не так ли?
В сущности же всё-таки в этом подходе инлайнинг не имеет никакого отношения к линкеру, ибо делается при сборке одтельной единицы компиляции.

natucia94

например компиляторы давно уже не обращают внимания на слово register.
ещё как обращают внимание, пробовал когда то на VC++6 или на VC++7 точно не помню.
Другое дело, что может больше и смысла нет его использовать.

Defolt1

Строго говоря, компиляторы не обязаны обращать на него внимание, и никогда не были обязаны: это не директива, а совет компилятору.
Смысл использовать его есть, но не в каждой предметной области, вероятно. При программировании DSP на С register весьма актуален.

sevast82

Сорри, не зарегистрировался.

bleyman

Ну дык чувак, наверное, имеет в виду х86 архитектуру.
При программировании микропроцессоров у компилятора обычно ещё штук двадцать дополнительных инструкций есть.

sevast82

Архитектура не имеет значения, потому что register входит в стандарт, например, в последний: ISO/IEC 9899:1999, ака С99.
То есть, если компилятор под некую архитектуру поддерживает С99, то он обязан понимать storage class register. Согласно тому же стандарту, он может учитывать наличие register в декларации, либо не учитывать, на его усмотрение.
Оставить комментарий
Имя или ник:
Комментарий: