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

 
 
> inline методы классов
koluna
сообщение May 28 2009, 12:15
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Здравствуйте!

WinAVR.
Пишем класс. Большинство его методов очень простые и маленькие. Хотим сделать эти методы inline.
Причём класс ДОЛЖЕН БЫТЬ описан в .h файле, а реализация методов ДОЛЖНА БЫТЬ ВЫПОЛНЕНА в .cpp файле. Не спрашивайте почему wink.gif
Т. е., трудность - разделение описания класса и определения его inline методов на два файла.

Код ниже - правильная реализация inline методов класса?
Может быть они должны быть реализованы или строго в теле класса (по-умолчанию уже inline) или вне класса, но с указанием спецификатора доступа и обязательно в .h файле?

qwe.h
Код
class qwe
{
   public:
      inline void f(void);
};


qwe.cpp
Код
void qwe::f(void)
{
// что-то
};


Благодарю заранее!


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
HARMHARM
сообщение May 28 2009, 22:17
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



В принципе, простой класс вообще может быть целиком описан в .h файле. Впрочем, практика на любителя.
Еще имейте в виду - компилятор обычно инлайнит только очень короткие функции, вроде такой:
Код
    inline unsigned int getUsedCount( void )
    {
        return qty;
    }

Функции подлиннее делает вызываемыми, причем уже в конкретном объекте компиляции, если объектов несколько, функция будет в каждом...
Тут, конечно, много зависит от компилятора и его настроек. Возможно, придется пользоваться директивами вроде
Код
#pragma inline=forced
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 28 2009, 22:31
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(HARMHARM @ May 29 2009, 01:17) *
если объектов несколько, функция будет в каждом...
на этапе компиляции. На этапе линковки останется только один экземпляр - ибо все копии этой функции имеют одно и то же имя. Аналогичный (а может и этот же) механизм действует при инстанцировании шаблонов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение May 29 2009, 03:54
Сообщение #4


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Сергей Борщ @ May 29 2009, 01:31) *
на этапе компиляции. На этапе линковки останется только один экземпляр - ибо все копии этой функции имеют одно и то же имя. Аналогичный (а может и этот же) механизм действует при инстанцировании шаблонов.

Точно! Не заметил, спасибо! rolleyes.gif
Не совсем понятно, почему линкер не ругается на одинаковые символы в этом случае? Подозреваю, что играют роль ? или ?? в начале названия метки, как и в ?cstartup... (IAR)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 29 2009, 11:09
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(HARMHARM @ May 29 2009, 06:54) *
Не совсем понятно, почему линкер не ругается на одинаковые символы в этом случае?
Потому что их имена экспортируются не директивой PUBLIC, а директивой PUBWEAK (можно почитать в описани на ассемблер), которая как раз для таких случаев и придумана. Ну или компилятор генерит аналогичные признаки в объектном коде. Еще одно применение этой директивы, которым вы наверняка пользуетесь - putchar(). Библиотечный экспортируется с PUBWEAK (это видно, если посмотреть список символов библиотеки при помощи xlib), а ваш - с PUBLIC.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение May 30 2009, 09:58
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Немножечко офф.
Цитата(Сергей Борщ @ May 29 2009, 14:09) *
Еще одно применение этой директивы, которым вы наверняка пользуетесь - putchar().

Я не использую putchar, вместо этого сделал свой sprintf с промежуточным буфером. Вопрос такой - будет ли эффективнее вариант с printf/putchar с той точки зрения что нет расхода памяти на буфер?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 30 2009, 18:41
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(HARMHARM @ May 30 2009, 12:58) *
будет ли эффективнее вариант с printf/putchar с той точки зрения что нет расхода памяти на буфер?
Думаю, что будет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- n_bogoyavlensky   inline методы классов   May 28 2009, 12:15
- - IgorKossak   Цитата(n_bogoyavlensky @ May 28 2009, 15...   May 28 2009, 12:24
|- - n_bogoyavlensky   Цитата(IgorKossak @ May 28 2009, 15:24) И...   May 28 2009, 12:26
|- - IgorKossak   Цитата(n_bogoyavlensky @ May 28 2009, 15...   May 28 2009, 13:05
- - Harbour   Страуструп: "Чтобы реализация вызова подстано...   May 28 2009, 19:37
|- - sergeeff   Цитата(HARMHARM @ May 30 2009, 12:58) Нем...   May 30 2009, 11:22
||- - HARMHARM   Цитата(sergeeff @ May 30 2009, 14:22) Воп...   May 30 2009, 11:55
- - alx2   Цитата(n_bogoyavlensky @ May 28 2009, 17...   May 29 2009, 11:10
- - sergeeff   Про inline уже неоднократно писалось на форуме. 1....   May 29 2009, 15:17
|- - Сергей Борщ   Цитата(sergeeff @ May 29 2009, 18:17) 3. ...   May 29 2009, 16:58
- - sergeeff   Ну да, правильнее сказать, что везде, кроме самого...   May 29 2009, 17:20
- - sergeeff   Сами же и отвечаете на поставленный вопрос. Эффект...   May 30 2009, 18:26


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

 


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


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