Russian Qt Forum

Программирование => С/C++ => Тема начата: xop от Февраль 10, 2010, 08:23



Название: static переменные в inline методах
Отправлено: 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 не устраивает.


Название: Re: static переменные в inline методах
Отправлено: uriel от Февраль 10, 2010, 08:31
Хм, а что Вас удивило? inline же не копипастит код в прямом смысле слова - это всё та же функция со всеми из этого вытекающими последствиями, просто, если я не ошибаюсь, нет оверхеда на передачу ей управления.


Название: Re: static переменные в inline методах
Отправлено: Tonal от Февраль 10, 2010, 09:22
Могут быть проблемы, если будешь работать с этим классом извне библиотеки - нужно проверить.
Ну а по стандарту всё верно - статик должен иметь только один экземпляр в пределах приложения.


Название: Re: static переменные в inline методах
Отправлено: SASA от Февраль 10, 2010, 11:40
Засунуто в inline - потому что на самом деле этот код генерится макросами, и очень хочется количество макросов минимизировать.

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


Название: Re: static переменные в inline методах
Отправлено: Igors от Февраль 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'ом  :)