2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: C++, inline функции
Сообщение12.09.2016, 14:52 


19/03/09
129
Раз договорились что inline особо не нужна, то no_inline наоборот нужнее
(для member функ.)
Ну при отладке удобно чтобы у функции была одна копия. Особо оба не нужны.
Да и стиль программирования, у меня чаще функции в h файле , чем в cpp

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение12.09.2016, 16:05 
Аватара пользователя


07/02/12
1403
Питер
green5
Кто договорился? Я не договаривался =)
А при отладке обычно используется отладочная конфигурация, при которой функции вообще не inline-ятся - ни разу не встречал, что б для этой цели использовали no_inline.

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение12.09.2016, 16:47 
Заслуженный участник
Аватара пользователя


16/07/14
8341
Цюрих
green5 в сообщении #1150721 писал(а):
Раз договорились что inline особо не нужна, то no_inline наоборот нужнее
(для member функ.)
Неправильное рассуждение. Более того - я бы предположил, что их нужность меняется одинаково, в зависимости от качества компилятора.

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение12.09.2016, 16:54 
Заслуженный участник


27/04/09
28128
Можно здесь спросить, какова семантика no_inline, если, насколько я помню, и насколько в теме уже писали выше, inline — это только просьба компилятору заинлайнить, если он не против? В таком случае немаркированная функция, по идее, не должна инлайниться и так…

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение12.09.2016, 17:06 
Заслуженный участник
Аватара пользователя


16/07/14
8341
Цюрих
Компилятор имеет право заинлайнить функцию (если докажет, что это не повлияет на наблюдаемое поведение), даже если его об этом не просили (и часто это делает). Заинлайнится ли вызов - unspecified behavior, если я ничего не путаю.
А no_inline - не часть стандарта, а разные директивы для разных компиляторов, которые это (естественно, непереносимо, и без гарантий от стандарта - только от компилятора) запрещают инлайн.

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение12.09.2016, 17:46 
Заслуженный участник


26/05/14
981
arseniiv, если реализовать функцию в теле класса, то компилятор сам добавляет неявный inline к её определению. На то есть причина. Когда заголовочный файл с классом включается в несколько разных файлов, каждый объектный файл после компиляции несёт в себе определения всех функций. Компоновщик выдаёт ошибку, если он обнаруживает несколько определений (не объявлений, а именно определений) одного и того же символа (функции). Но если компоновщик видит несколько определений одного символа помеченных inline, он выбирает какое-то одно, а остальные молча выбрасывает.
inline - это директива компоновщику в первую очередь и необязательный намёк компилятору во вторую.
Определения функций в теле класса без inline бесполезны. Чтобы исправить проблему компилятор добавляет inline сам. А программисты изыскивают методы запретить этот автоматический inline. Хотя чтобы запретить его достаточно вынести определение функции из класса.
Вот демонстрация проблемы. Я не могу отменить inline внутри класса, но я могу сымитировать ситуацию вынеся определение функции из класса без inline. Ошибка проявляется немедленно:
с.h:
Используется синтаксис C++
class C { void m(); };
/* inline */ void C::m() {}
a.cpp:
Используется синтаксис C++
#include <c.h>
int main() {}
b.cpp:
Используется синтаксис C++
#include <c.h>
shell:
Код:
+~/tmp/no_inline $ g++ -I. a.cpp b.cpp
/tmp/ccrb2IQN.o: In function `C::m()':
b.cpp:(.text+0x0): multiple definition of `C::m()'
/tmp/ccFdgZug.o:a.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение12.09.2016, 18:25 
Заслуженный участник


27/04/09
28128
Ого.

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение13.09.2016, 02:58 
Аватара пользователя


07/02/12
1403
Питер
slavav
Это еще как настроить компилятор/линкер и в зависимости от того, какой выбрать.

Возможно, Вы знаете, но на всякий:
в GCC кстати принято вне классов писать static inline, воизбежание.. В классах же static завербован под иные нужды и некоторые проблемы всвязи с этим имеются.

Универсально с любым компилятором лечится оно так:
- что хочется inline, реализуем в заголовке, и пишем inline в классах (методах) и static inline (для gcc) в функциях; для MS пишем везде __forceinline (можно воспользоваться услугами препроцессора для универсальности)
- non-inline объявляем в заголовке и реализуем в cpp, inline соответсвенно не пишем. За-inline-ить компилятор такое сможет только внутри cpp, содержащего реализацию

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение13.09.2016, 09:58 
Аватара пользователя


07/02/12
1403
Питер
slavav в сообщении #1150770 писал(а):
Вот демонстрация проблемы. Я не могу отменить inline внутри класса, но я могу сымитировать ситуацию вынеся определение функции из класса без inline. Ошибка проявляется немедленно

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

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение13.09.2016, 10:51 
Заслуженный участник


02/08/11
6874

(Оффтоп)

bondkim137 в сообщении #1150883 писал(а):
Вас там реализация метода находится в заголовке, но за пределами класса - так делать нельзя. При подключении этого заголовка, одна и та же реализация соответсвенно вставляется в два разных cpp, после чего линкер не может это все собрать, т.к. имена конфликтуют.
Перелогинтесь, Капитан.

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение13.09.2016, 14:21 
Аватара пользователя


07/02/12
1403
Питер

(Оффтоп)

да поздно уже

 Профиль  
                  
 
 Re: C++, inline функции
Сообщение13.09.2016, 17:40 
Заслуженный участник


02/08/11
6874

(Оффтоп)

Впрочем для некоторых читателей темы это, конечно, может быть полезным замечанием.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group