Russian Qt Forum
Ноябрь 24, 2024, 03:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: static переменные в inline методах  (Прочитано 4162 раз)
xop
Гость
« : Февраль 10, 2010, 08:23 »

Ситуация примерно такая:
class CMyReflectedObject : public CReflectedObject
{
private:
    // Метаданные класса
    static CMetaTable s_MetaTable;
    // Свойство
    int m_MyProperty;
public:
    // Доступ к свойству
    inline int MyProperty() const { return m_MyProperty; }
    inline static int idxMyProperty() { static int i = s_MetaTable.propByName("MyProperty"); return i; }
    inline void setMyProperty( int value ) { m_MyProperty = value; notifyUpdate( idxMyProperty() ); }
};

Под линуксом в gcc в пределах одной shared-библиотеки такое работает (т.е. для множества вызовов setMyProperty из разных мест propByName вызывается только один раз), дальше пока не проверял. Собственно вопрос - КАК это вообще работает, и насколько плохо/непортабельно использовать сабж? Кстати, я бы вполне понял и смирился, если бы статическая переменная генерилась в каждом месте использования inline функции, но интеллект gcc превзошел все мои ожидания, что и сбило с толку - чего еще от него можно ждать.

Засунуто в inline - потому что на самом деле этот код генерится макросами, и очень хочется количество макросов минимизировать.

P.S. Да, я знаю, что подобный функционал уже реализован в QObject, но по некоторым причинам использование QObject не устраивает.
Записан
uriel
Гость
« Ответ #1 : Февраль 10, 2010, 08:31 »

Хм, а что Вас удивило? inline же не копипастит код в прямом смысле слова - это всё та же функция со всеми из этого вытекающими последствиями, просто, если я не ошибаюсь, нет оверхеда на передачу ей управления.
Записан
Tonal
Гость
« Ответ #2 : Февраль 10, 2010, 09:22 »

Могут быть проблемы, если будешь работать с этим классом извне библиотеки - нужно проверить.
Ну а по стандарту всё верно - статик должен иметь только один экземпляр в пределах приложения.
Записан
SASA
Гость
« Ответ #3 : Февраль 10, 2010, 11:40 »

Засунуто в inline - потому что на самом деле этот код генерится макросами, и очень хочется количество макросов минимизировать.

Пишу аналогичные макросы. Очень сложно  отлаживаться. Думаю как их упрастить. Можно глянуть на ваши макросы (если не секрет).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 15, 2010, 04:34 »

    inline static int idxMyProperty() { static int i = s_MetaTable.propByName("MyProperty"); return i; }
Может не очень удачный пример - static здесь никак не роялит. Если уж проверять, то:
Код:
inline static int idxMyProperty() 
{
  static int i = -1;    // начальное (недопустимое) значение
  if (i < 0)
    i = s_MetaTable.propByName("MyProperty");
  return i;
}
По идее должны иметь один i на все вызовы (и внешние тоже), inline есть личное дело компилятора, ф-циональность та же. Да и вообще неизвестно будет ли он делать это inline'ом  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 23.