реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> linker
demiurg_spb
сообщение Jun 22 2009, 16:14
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(mdmitry @ Jun 22 2009, 20:05) *
объявление:...
Что Вы хотели этим сказать, что бывает атрибут always_inline? Так это в мануале прописано... Тут разговор о другом, что даже без упоминания о inline, простой статик частенько позволяет компилятору инлайнить статические функции. Всё. Конец мысли.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jun 22 2009, 16:22
Сообщение #17


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Гарантированно инлайн и никаких мыслей более


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 22 2009, 16:26
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(mdmitry @ Jun 22 2009, 20:22) *
Гарантированно инлайн и никаких мыслей более
Для этих целей у меня специальный макрос заготовлен:
Код
#define INLINE __inline__ __attribute__((always_inline))


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 22 2009, 16:58
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Jun 22 2009, 19:26) *
Для этих целей у меня специальный макрос заготовлен:
Код
#define INLINE __inline__ __attribute__((always_inline))

И обязательно рядом
Код
#define NOINLINE __attribute__((noinline))

тоже бывает нужен.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 23 2009, 09:29
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(IgorKossak @ Jun 21 2009, 22:17) *
В Вашем же примере статическая функция static int foo(int x) вызывается в int bar(int x), поэтому (если в свою очередь последняя функция также используется в приложении) линкер не должен её выкинуть.
Верно, что не должен, но не поэтому. Как уже сказал aesok, линкер не работает с функциями. Линкер работает с секциями. Он либо включает секцию в выходной файл, либо не включает. Целью приведенного мной примера было показать, что в сгенеренном ассемблером объектном файле вообще нет глобального символа foo, таким образом, линкер вообще не узнает о существовании такой функции.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 23 2009, 18:11
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(alx2 @ Jun 23 2009, 13:29) *
Целью приведенного мной примера было показать, что в сгенеренном ассемблером объектном файле вообще нет глобального символа foo,


Нет, нету глобального символа foo, потому что функция foo статическая и ее область видимости ограничивается одним модулем.

Цитата(alx2 @ Jun 23 2009, 13:29) *
таким образом, линкер вообще не узнает о существовании такой функции.


Если компилятор не проинлайнит функцию foo, а то линкер увидет метку foo. И в даном случае при компиляции примера без оптимизации видим:

Код
$ nm  test2.o
00000000 b .bss
00000000 d .data
00000000 t .text
0000000b T _bar
00000000 t _foo



Анатолий.
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 24 2009, 10:54
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(aesok @ Jun 23 2009, 23:11) *
Если компилятор не проинлайнит функцию foo, а то линкер увидет метку foo.
Код
00000000 t _foo
Так это же локальный символ - буква "t" маленькая. Разве линкер работает с локальными символами? Я почему-то считал, что он работает только с глобальными, а локальные его интересовать совершенно не должны. Это будет диверсия, если линкер удовлетворит внешнюю ссылку локальным объектом...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01811 секунд с 7
ELECTRONIX ©2004-2016