Re[11]: inline функции
От: Павел Кузнецов  
Дата: 23.07.03 19:13
Оценка:
Здравствуйте, skyline, Вы писали:

WH>>> Если реализовать функцию в зголовке и не пометить ее inline то

WH>>> словишь ошибку линкера.

<...>

s> Написал функцию длинную функцию в *.h, включил её во многие файлы,

s> там её по вызывал — уровень предупреждения — максимальный, и ни чего.
s> VC 6 sp 5

Эти ошибки должен выдавать линкер.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: inline функции
От: skyline Россия  
Дата: 23.07.03 19:37
Оценка:
Здравствуйте, Андрей Тарасевич

Теперь я с тобой согласен
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[11]: inline функции
От: Андрей Тарасевич Беларусь  
Дата: 23.07.03 20:21
Оценка:
Здравствуйте, skyline, Вы писали:


WH>>> Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.


s>>> На каком компиляторе? Мой VC 6 так не делает


ПК>>Делает. Включи заголовок в несколько .cpp-файлов.

S>Написал функцию длинную функцию в *.h, включил её во многие файлы, там её по вызывал — уровень предупреждения — максимальный, и ни чего. VC 6 sp 5

Не-static не-inline функция в многократно включенном *.h файле в VC6 будет приводить к ошибке линковки LNK2005 в ста процентах случаев. Если у тебя этой ошибки не возникает, значит ты не соблюдаешь одно или несколько из вышеприведенных условий.
Best regards,
Андрей Тарасевич
Re[5]: inline функции
От: Андрей Тарасевич Беларусь  
Дата: 23.07.03 20:36
Оценка: 44 (3) +2
Здравствуйте, _vovin, Вы писали:

S>>>К тому же, inline нужно писать только после того, как её необходимость доказал профайлер, и ни секундой раньше.


АТ>>Ни в коем случае. В общем случае правильная функция — сущность более абстрактного уровня, чем вызывающий ее код.

_>[...]

_>Сказочник. Если тебе понадобится изменить интерфейс функции из-за изменившегося использования, будешь ли ты оставлять эту сущность более абстрактного уровня нетронутой? Нет.


Неверно. Ответ зависит от уровня абстракции и, в конце концов, от того, какое дизайнерское решение я приму в каждом конкретном случае. Может быть оставлю нетронутой, создав рядом еще одну сущность (если она того заслуживает). Может быть оставлю нетронутой, вписав в прежнюю точку вызова самостоятельный код (т.е. избавивишись от вызова функции вообще). А может быть и изменю. Не существует однозначного ответа.

_>Потому что форму более абстрактного уровня выводят потребности более конкретного уровня.


Нет. Не выводят. А "оказывают скрытое и опосредованное влияние". Создавать абстракции строго по мере возниковения и прямо из конкретных потребностей — путь к грубым ошибкам дизайна.

_>Это просто есть такое дизайнерское решение, что нельзя явно обращаться к менее абстрактному уровню, чтобы не ограничивать варианты использования решения.


Это просто выриант одной частной дизайнерской ошибки.

_>Мы вольны указывать абстрактному уровню, как он должен выглядеть снаружи, но мы не должны его заставлять знать что-то конкретное о нашей задаче.


Одным из основных свойств абстрактного уровня является его универсальность — т.е. его применимость из более чем одного конкретного контекста. Если абстрактный уровень не обладает этим свойством, то он просто напросто не заслуживает права на существование как отдельный уровень.

Если параметры абстрактного уровня диктовать из какого-то конкретного контекста, то это убьет все универасльность и асбтрактность напрочь.
Best regards,
Андрей Тарасевич
Re: inline функции
От: ArtDenis Россия  
Дата: 24.07.03 03:28
Оценка:
Здравствуйте, aparat, Вы писали:

a> есть функция критичиская по времени исполнения(считает квадрат длинны

a> вектора), которую я объявил inline, в полученном коде функция не
a> подставляется, а вызывается использовал VC 6.0 смотрел DEBUG и RELEASE,
a> пробовал объявлять __forceinline. всеравно не подставилась

У меня была несколько противоположная проблема на C++Builder4. Если даже
функция не объявлялась как inline, но её реализация находилась внутри
объявления класса, то, независимо от размер функции, в код она ставлялась в
месте вызова. (естественно в RELEASE)

Такая штука делалась, чтобы не подключать к проекту лишние cpp-молдули.

---------------------------------------------------------
СНП, Artyomov Denis. E-mail: artyomov <at> inbox.ru
Posted via RSDN NNTP Server 1.7 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: inline функции
От: folk Россия  
Дата: 24.07.03 03:36
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>У меня была несколько противоположная проблема на C++Builder4. Если даже

AD>функция не объявлялась как inline, но её реализация находилась внутри
AD>объявления класса, то, независимо от размер функции, в код она ставлялась в
AD>месте вызова. (естественно в RELEASE)

AD>Такая штука делалась, чтобы не подключать к проекту лишние cpp-молдули.


Ничего удивительного, по стандарту это эквивалентно объявлению функции как inline.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[3]: inline функции
От: ArtDenis Россия  
Дата: 24.07.03 03:44
Оценка:
Здравствуйте, folk, Вы писали:

AD>> У меня была несколько противоположная проблема на C++Builder4. Если

AD>> даже функция не объявлялась как inline, но её реализация находилась
AD>> внутри объявления класса, то, независимо от размер функции, в код она
AD>> ставлялась в месте вызова. (естественно в RELEASE)
f> Ничего удивительного, по стандарту это эквивалентно объявлению функции
f> как inline.

Да, но компилятор не смотрел на размер функции. В этой функции у меня
вызывались другие функции этого класса (из других — третьи), причём
все функции были inline. В результате чего код разрастался до
невообразимых размеров.

Всё это я смог побороть так: переделал клас в шаблон класса и вынес
реализацию функций из объявления, оставив их внутри *.h файла.

---------------------------------------------------------
СНП, Artyomov Denis. E-mail: artyomov <at> inbox.ru
Posted via RSDN NNTP Server 1.7 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: inline функции
От: darth  
Дата: 24.07.03 06:38
Оценка:
А может в 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

Вобщем search в msdn поможет
... << RSDN@Home 1.0 beta 6a >>
Re[2]: inline функции
От: Павел Кузнецов  
Дата: 24.07.03 07:41
Оценка:
Здравствуйте, ArtDenis, Вы писали:

A> У меня была несколько противоположная проблема на C++Builder4. Если

A> даже функция не объявлялась как inline, но её реализация находилась
A> внутри объявления класса, то <...>

... то это эквивалентно тому, что она была бы объявлена как inline.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: inline функции
От: Dmitriev Sergey Россия http://dmi3s.blogspot.com/
Дата: 28.07.03 16:23
Оценка:
Здравствуйте, aparat,

Посмотри Project Settings -> C/C++ -> Optimizations -> Inline function expantion

Вы писали:

A>привет всем


A>есть функция критичиская по времени исполнения(считает квадрат длинны вектора), которую я объявил inline,

A>в полученном коде функция не подставляется, а вызывается
A>использовал VC 6.0 смотрел DEBUG и RELEASE, пробовал объявлять __forceinline.
A>всеравно не подставилась

A>Как это сделать?
Re[2]: inline функции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.07.03 07:25
Оценка:
Здравствуйте, 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).

Алексей Кирдин
Re[8]: inline функции
От: SWW Россия  
Дата: 29.07.03 07:47
Оценка: -2
WH>А что тут не понятного? Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.

1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.
2. Компилироваться такая функция будет только если к ней есть обращения.
3. Если заголовок включен в несколько файлов, ошибок линковки не будет, даже если компилятор не сочтет нужным ее инлайнить.
Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.
Re[9]: inline функции
От: Андрей Тарасевич Беларусь  
Дата: 29.07.03 07:57
Оценка:
Здравствуйте, SWW, Вы писали:

WH>>А что тут не понятного? Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.


SWW>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.


Ничего подобного. Собственно компилятор не в состоянии распознать функцию, реализованную в заголовке, по той простой причине, что к моменту собственно компиляции никаких заголовков уже нет и в помине — препроцессор уже всех их повключал в файлы реализации и от заголовков никаких следов уже не осталось.

SWW>2. Компилироваться такая функция будет только если к ней есть обращения.


Ничего подобного. Компилироваться такая функция всегда. "Только если к ней есть обращения" — это больше похоже на шаблоны функций. Но тут речь идет не о шаблонах.

SWW>3. Если заголовок включен в несколько файлов, ошибок линковки не будет, даже если компилятор не сочтет нужным ее инлайнить.


С inline-функциями действительно ошибок не будет. С не-inline — будет ошибка — нарушение ODR.

SWW>Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.


WTL — шаблонная библиотека. Потому она и реализована в h-файлах. Реализация шаблонов именно в h-файлах и должна находиться. Независимо от инлайновости. Но в этой дискуссии речь идет, напомню, именно об инлайновости, а не о шаблонах.
Best regards,
Андрей Тарасевич
Re[9]: inline функции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.07.03 08:01
Оценка:
Здравствуйте, SWW, Вы писали:

SWW>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.

... в теле класса ... Никак не просто в заголовке.
SWW>3. Если заголовок включен в несколько файлов, ошибок линковки не будет, даже если компилятор не сочтет нужным ее инлайнить.
Если функция не объявлена inline и определна в заголовке — будет ошибка линкера о множественном определении.

SWW>Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.

Что тут удивительного7 Она же TL — Template Library. Для функций-шаблонов "ODR несколько ослаблено", т.е. позволяет упускать inline даже при определении шаблона в заголоваочном файле. Для объsxys[? не шаблонных, функций — это не так.
Алексей Кирдин
Re[10]: inline функции
От: Другой Аноним  
Дата: 29.07.03 08:08
Оценка:
Здравствуйте, Kaa, Вы писали:

SWW>>Весь WTL реализован в h-файлах. И некоторые из них включаются в несколько .cpp-файлов. И при этом нет никаких ошибок линкера.

Kaa>Что тут удивительного7 Она же TL — Template Library. Для функций-шаблонов "ODR несколько ослаблено", т.е. позволяет упускать inline даже при определении шаблона в заголоваочном файле. Для объsxys[? не шаблонных, функций — это не так.

Как понять "упускать inline"? Если функция шаблонная, то это вовсе не значит, что она подставляемая.
Re[10]: inline функции
От: SWW Россия  
Дата: 29.07.03 08:28
Оценка:
SWW>>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.

АТ>Ничего подобного. Собственно компилятор не в состоянии распознать функцию, реализованную в заголовке, по той


7.1.2
...
3 A function defined within a class definition is an inline function.
Re[9]: inline функции
От: dkon  
Дата: 29.07.03 08:28
Оценка:
Здравствуйте, SWW, Вы писали:

WH>>А что тут не понятного? Если реализовать функцию в зголовке и не пометить ее inline то словишь ошибку линкера.


SWW>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.


возможно, ты путаешь с функциями, реализованными внутри определения класса.
Re[10]: inline функции
От: SWW Россия  
Дата: 29.07.03 08:32
Оценка:
SWW>>1. Функция, реализованная в заголовке, считается имеющей модификатор 'inline'.

D>возможно, ты путаешь с функциями, реализованными внутри определения класса.


А что, есть люди, которые пишут реализацию функции вне определения класса, но в том же h-файле?
Re[11]: inline функции
От: Anton V. Kolotaev  
Дата: 29.07.03 08:34
Оценка:
Здравствуйте, SWW, Вы писали:

SWW>А что, есть люди, которые пишут реализацию функции вне определения класса, но в том же h-файле?


Я, например.
Re[11]: inline функции
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 29.07.03 08:38
Оценка:
Здравствуйте, Другой Аноним, Вы писали:

SWW>>>...И при этом нет никаких ошибок линкера.

Kaa>>Что тут удивительного7 Она же TL — Template Library. Для функций-шаблонов "ODR несколько ослаблено", т.е. позволяет упускать inline даже при определении шаблона в заголоваочном файле. Для объявлений нешаблонных, функций — это не так.

ДА>Как понять "упускать inline"? Если функция шаблонная, то это вовсе не значит, что она подставляемая.


Я отвечал на выделенный фрагмент.

Тут речь о другом: для шаблонный функций, определенных в заголовках, даже в случае отсутствия спецификатора inline, ODR не нарушается, что неверно для обычных, нешаблонных функций. Встраиваемость отсутствием спецификатора inline не прививается — это правда.
Алексей Кирдин
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.