Здравствуйте, skyline, Вы писали:
WH>>> Если реализовать функцию в зголовке и не пометить ее inline то WH>>> словишь ошибку линкера.
<...>
s> Написал функцию длинную функцию в *.h, включил её во многие файлы, s> там её по вызывал — уровень предупреждения — максимальный, и ни чего. s> VC 6 sp 5
Эти ошибки должен выдавать линкер.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
WH>>> Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.
s>>> На каком компиляторе? Мой VC 6 так не делает
ПК>>Делает. Включи заголовок в несколько .cpp-файлов. S>Написал функцию длинную функцию в *.h, включил её во многие файлы, там её по вызывал — уровень предупреждения — максимальный, и ни чего. VC 6 sp 5
Не-static не-inline функция в многократно включенном *.h файле в VC6 будет приводить к ошибке линковки LNK2005 в ста процентах случаев. Если у тебя этой ошибки не возникает, значит ты не соблюдаешь одно или несколько из вышеприведенных условий.
Здравствуйте, _vovin, Вы писали:
S>>>К тому же, inline нужно писать только после того, как её необходимость доказал профайлер, и ни секундой раньше.
АТ>>Ни в коем случае. В общем случае правильная функция — сущность более абстрактного уровня, чем вызывающий ее код. _>[...]
_>Сказочник. Если тебе понадобится изменить интерфейс функции из-за изменившегося использования, будешь ли ты оставлять эту сущность более абстрактного уровня нетронутой? Нет.
Неверно. Ответ зависит от уровня абстракции и, в конце концов, от того, какое дизайнерское решение я приму в каждом конкретном случае. Может быть оставлю нетронутой, создав рядом еще одну сущность (если она того заслуживает). Может быть оставлю нетронутой, вписав в прежнюю точку вызова самостоятельный код (т.е. избавивишись от вызова функции вообще). А может быть и изменю. Не существует однозначного ответа.
_>Потому что форму более абстрактного уровня выводят потребности более конкретного уровня.
Нет. Не выводят. А "оказывают скрытое и опосредованное влияние". Создавать абстракции строго по мере возниковения и прямо из конкретных потребностей — путь к грубым ошибкам дизайна.
_>Это просто есть такое дизайнерское решение, что нельзя явно обращаться к менее абстрактному уровню, чтобы не ограничивать варианты использования решения.
Это просто выриант одной частной дизайнерской ошибки.
_>Мы вольны указывать абстрактному уровню, как он должен выглядеть снаружи, но мы не должны его заставлять знать что-то конкретное о нашей задаче.
Одным из основных свойств абстрактного уровня является его универсальность — т.е. его применимость из более чем одного конкретного контекста. Если абстрактный уровень не обладает этим свойством, то он просто напросто не заслуживает права на существование как отдельный уровень.
Если параметры абстрактного уровня диктовать из какого-то конкретного контекста, то это убьет все универасльность и асбтрактность напрочь.
Здравствуйте, aparat, Вы писали:
a> есть функция критичиская по времени исполнения(считает квадрат длинны a> вектора), которую я объявил inline, в полученном коде функция не a> подставляется, а вызывается использовал VC 6.0 смотрел DEBUG и RELEASE, a> пробовал объявлять __forceinline. всеравно не подставилась
У меня была несколько противоположная проблема на C++Builder4. Если даже
функция не объявлялась как inline, но её реализация находилась внутри
объявления класса, то, независимо от размер функции, в код она ставлялась в
месте вызова. (естественно в RELEASE)
Такая штука делалась, чтобы не подключать к проекту лишние cpp-молдули.
Здравствуйте, ArtDenis, Вы писали:
AD>У меня была несколько противоположная проблема на C++Builder4. Если даже AD>функция не объявлялась как inline, но её реализация находилась внутри AD>объявления класса, то, независимо от размер функции, в код она ставлялась в AD>месте вызова. (естественно в RELEASE)
AD>Такая штука делалась, чтобы не подключать к проекту лишние cpp-молдули.
Ничего удивительного, по стандарту это эквивалентно объявлению функции как inline.
Здравствуйте, folk, Вы писали:
AD>> У меня была несколько противоположная проблема на C++Builder4. Если AD>> даже функция не объявлялась как inline, но её реализация находилась AD>> внутри объявления класса, то, независимо от размер функции, в код она AD>> ставлялась в месте вызова. (естественно в RELEASE) f> Ничего удивительного, по стандарту это эквивалентно объявлению функции f> как inline.
Да, но компилятор не смотрел на размер функции. В этой функции у меня
вызывались другие функции этого класса (из других — третьи), причём все функции были inline. В результате чего код разрастался до
невообразимых размеров.
Всё это я смог побороть так: переделал клас в шаблон класса и вынес
реализацию функций из объявления, оставив их внутри *.h файла.
А может в VC есть требования к инлайновым функциям как в билдере.
например в хелпе от билдерa написано:
An inline function with an exception-specification will never be expanded inline by C++Builder.
An inline function that takes at least one parameter that is of type ’class with a destructor’ will not be expanded inline.
An inline function that returns a class with a destructor by value will not be expanded inline whenever there are variables or temporaries that need to be destructed within the return expression
Здравствуйте, ArtDenis, Вы писали:
A> У меня была несколько противоположная проблема на C++Builder4. Если A> даже функция не объявлялась как inline, но её реализация находилась A> внутри объявления класса, то <...>
... то это эквивалентно тому, что она была бы объявлена как inline.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Вы писали:
A>привет всем
A>есть функция критичиская по времени исполнения(считает квадрат длинны вектора), которую я объявил inline, A>в полученном коде функция не подставляется, а вызывается A>использовал VC 6.0 смотрел DEBUG и RELEASE, пробовал объявлять __forceinline. A>всеравно не подставилась
A>Как это сделать?
Здравствуйте, darth, Вы писали:
D>А может в VC есть требования к инлайновым функциям как в билдере.
The function or its caller is compiled with /Ob0 (the default option for debug builds).
The function and the caller use different types of exception handling (C++ exception handling in one, structured exception handling in the other).
The function has a variable argument list.
The function uses inline assembly and is not compiled with /Og, /Ox, /O1, or /O2).
Function returns an unwindable object by value and is not compiled with /GX, /EHs, or /EHa).
The function receives a copy-constructed object passed by value, when compiled with /GX, /EHs,, or /EHa.
The function is recursive and is not accompanied by #pragma(inline_recursion, on). With the pragma, recursive functions can be inlined to a default depth of eight calls. To change the inlining depth, use #pragma(inline_depth, n).
WH>А что тут не понятного? Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.
1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
2. Компилироваться такая функция будет только если к ней есть обращения.
3. Если заголовок включен в несколько файлов, ошибок линковки не будет, даже если компилятор не сочтет нужным ее инлайнить.
Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.
Здравствуйте, SWW, Вы писали:
WH>>А что тут не понятного? Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.
SWW>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
Ничего подобного. Собственно компилятор не в состоянии распознать функцию, реализованную в заголовке, по той простой причине, что к моменту собственно компиляции никаких заголовков уже нет и в помине — препроцессор уже всех их повключал в файлы реализации и от заголовков никаких следов уже не осталось.
SWW>2. Компилироваться такая функция будет только если к ней есть обращения.
Ничего подобного. Компилироваться такая функция всегда. "Только если к ней есть обращения" — это больше похоже на шаблоны функций. Но тут речь идет не о шаблонах.
SWW>3. Если заголовок включен в несколько файлов, ошибок линковки не будет, даже если компилятор не сочтет нужным ее инлайнить.
С inline-функциями действительно ошибок не будет. С не-inline — будет ошибка — нарушение ODR.
SWW>Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.
WTL — шаблонная библиотека. Потому она и реализована в h-файлах. Реализация шаблонов именно в h-файлах и должна находиться. Независимо от инлайновости. Но в этой дискуссии речь идет, напомню, именно об инлайновости, а не о шаблонах.
Здравствуйте, SWW, Вы писали:
SWW>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
... в теле класса ... Никак не просто в заголовке. SWW>3. Если заголовок включен в несколько файлов, ошибок линковки не будет, даже если компилятор не сочтет нужным ее инлайнить.
Если функция не объявлена inline и определна в заголовке — будет ошибка линкера о множественном определении.
SWW>Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.
Что тут удивительного7 Она же TL — Template Library. Для функций-шаблонов "ODR несколько ослаблено", т.е. позволяет упускать inline даже при определении шаблона в заголоваочном файле. Для объsxys[? не шаблонных, функций — это не так.
Здравствуйте, Kaa, Вы писали:
SWW>>Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера. Kaa>Что тут удивительного7 Она же TL — Template Library. Для функций-шаблонов "ODR несколько ослаблено", т.е. позволяет упускать inline даже при определении шаблона в заголоваочном файле. Для объsxys[? не шаблонных, функций — это не так.
Как понять "упускать inline"? Если функция шаблонная, то это вовсе не значит, что она подставляемая.
SWW>>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
АТ>Ничего подобного. Собственно компилятор не в состоянии распознать функцию, реализованную в заголовке, по той
7.1.2
...
3 A function defined within a class definition is an inline function.
Здравствуйте, SWW, Вы писали:
WH>>А что тут не понятного? Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.
SWW>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
возможно, ты путаешь с функциями, реализованными внутри определения класса.
SWW>>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
D>возможно, ты путаешь с функциями, реализованными внутри определения класса.
А что, есть люди, которые пишут реализацию функции вне определения класса, но в том же h-файле?
Здравствуйте, Другой Аноним, Вы писали:
SWW>>>...И при этом нет никаких ошибок линкера. Kaa>>Что тут удивительного7 Она же TL — Template Library. Для функций-шаблонов "ODR несколько ослаблено", т.е. позволяет упускать inline даже при определении шаблона в заголоваочном файле. Для объявлений нешаблонных, функций — это не так.
ДА>Как понять "упускать inline"? Если функция шаблонная, то это вовсе не значит, что она подставляемая.
Я отвечал на выделенный фрагмент.
Тут речь о другом: для шаблонный функций, определенных в заголовках, даже в случае отсутствия спецификатора inline, ODR не нарушается, что неверно для обычных, нешаблонных функций. Встраиваемость отсутствием спецификатора inline не прививается — это правда.