2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: C++, inline функции
Сообщение12.09.2016, 14:52 
Раз договорились что inline особо не нужна, то no_inline наоборот нужнее
(для member функ.)
Ну при отладке удобно чтобы у функции была одна копия. Особо оба не нужны.
Да и стиль программирования, у меня чаще функции в h файле , чем в cpp

 
 
 
 Re: C++, inline функции
Сообщение12.09.2016, 16:05 
Аватара пользователя
green5
Кто договорился? Я не договаривался =)
А при отладке обычно используется отладочная конфигурация, при которой функции вообще не inline-ятся - ни разу не встречал, что б для этой цели использовали no_inline.

 
 
 
 Re: C++, inline функции
Сообщение12.09.2016, 16:47 
Аватара пользователя
green5 в сообщении #1150721 писал(а):
Раз договорились что inline особо не нужна, то no_inline наоборот нужнее
(для member функ.)
Неправильное рассуждение. Более того - я бы предположил, что их нужность меняется одинаково, в зависимости от качества компилятора.

 
 
 
 Re: C++, inline функции
Сообщение12.09.2016, 16:54 
Можно здесь спросить, какова семантика no_inline, если, насколько я помню, и насколько в теме уже писали выше, inline — это только просьба компилятору заинлайнить, если он не против? В таком случае немаркированная функция, по идее, не должна инлайниться и так…

 
 
 
 Re: C++, inline функции
Сообщение12.09.2016, 17:06 
Аватара пользователя
Компилятор имеет право заинлайнить функцию (если докажет, что это не повлияет на наблюдаемое поведение), даже если его об этом не просили (и часто это делает). Заинлайнится ли вызов - unspecified behavior, если я ничего не путаю.
А no_inline - не часть стандарта, а разные директивы для разных компиляторов, которые это (естественно, непереносимо, и без гарантий от стандарта - только от компилятора) запрещают инлайн.

 
 
 
 Re: C++, inline функции
Сообщение12.09.2016, 17:46 
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 
Ого.

 
 
 
 Re: C++, inline функции
Сообщение13.09.2016, 02:58 
Аватара пользователя
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 
Аватара пользователя
slavav в сообщении #1150770 писал(а):
Вот демонстрация проблемы. Я не могу отменить inline внутри класса, но я могу сымитировать ситуацию вынеся определение функции из класса без inline. Ошибка проявляется немедленно

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

 
 
 
 Re: C++, inline функции
Сообщение13.09.2016, 10:51 

(Оффтоп)

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

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

(Оффтоп)

да поздно уже

 
 
 
 Re: C++, inline функции
Сообщение13.09.2016, 17:40 

(Оффтоп)

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

 
 
 [ Сообщений: 27 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group