Название: 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() |