tag:blogger.com,1999:blog-10303035.post7142303943223901113..comments2024-02-04T23:20:04.066+03:00Comments on Алёна C++: Порядок инициализации статических переменныхAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-10303035.post-73914277685008361712018-12-31T11:16:44.712+03:002018-12-31T11:16:44.712+03:00 Все знают, как писать хороший код, но никто не... Все знают, как писать хороший код, но никто не пишет:) Но никто не знает, что делать с существующим кодом :) Ну вот есть оно, соглашусь, что кривое, но его 300+ мегов(реальный проект) и месяц времени... будем ругать архитектуру и переписывать с нуля? Успехов...<br /><br />А теперь по делу. <br /><br />Порядок инициализации зависит от порядка объектных файлов, передаваемых линкеру. По крайней мере на юниксах. Он может быть прямой или обратный. Просто напишите тестовое приложение и поиграйтесь. <br /><br />Затем найдите в проекте объектные файлы с нетривиальными глобальными объектами. Под линуксами в таких объектниках присутствует функция `__GLOBAL_sub_ что-то там`... Остальные объектники на результат не влияют.<br /><br />Утилитой `nm` можно получить список импорта экспорта каждого объектника. Глобальные переменные лежет в секции `T`. Соответственно импорт обозначен как `t`<br /><br />Строим граф зависимостей объектых модулей. Если А импортирует что-то из Б, значит А зависит от Б и Б должен инициализироваться раньше. Существует вероятност циклического графа, если объект используется вне секции глобальной инициализации, такие случаи правятся ручками.<br /><br />Делаем топологическую сортировку графа. Инвертируем массив если нужно.<br /><br />Линкуем бинарник в нужном порядке.<br /><br />Для красоты для все эти действия реализуем в скриптах и заносим всю процедуру в мейкфайл.<br /><br /><br />Это работает уже 5 лет в проектах по 4М строк кода.<br /><br />Успехов.<br /><br /><br />Anonymoushttps://www.blogger.com/profile/01610184656371360028noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-45174259647517560742012-10-17T00:57:30.413+04:002012-10-17T00:57:30.413+04:00Никто тут про это пока не говорил, но для полей кл...Никто тут про это пока не говорил, но для <b>полей класса общих для всех членов</b> (static) возникает та же проблема. А без них бывает трудно обойтись.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-38591186327216530852011-11-08T09:08:32.605+04:002011-11-08T09:08:32.605+04:00> фсё ф топку
А проекту уже 3 года (это хорошо...> фсё ф топку<br /><br />А проекту уже 3 года (это хорошо, если 3). Переписать с нуля - много денег.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-90174997257289361442011-07-21T05:36:02.423+04:002011-07-21T05:36:02.423+04:00>Они как-то самопроизвольно начинают друг от др...>Они как-то самопроизвольно начинают друг от друга зависеть.<br /><br />ошибки проектирования<br />фсё ф топкуAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-63045606588857218552011-07-21T00:25:31.420+04:002011-07-21T00:25:31.420+04:002 Александр
Альтернатива, например, все же помес...2 Александр <br /><br />Альтернатива, например, все же поместить инициализацию в *.h файлы, но применить счетчики Шварца, уже упомянутые выше, чтобы не вызывать ее многократно.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-17887837886804617582011-07-20T20:19:26.178+04:002011-07-20T20:19:26.178+04:00Для этого счетчик шварца вполне подойдет.Для этого счетчик шварца вполне подойдет.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-73996963983623774162011-07-20T11:59:17.307+04:002011-07-20T11:59:17.307+04:00такие переменные надо возвращать через функцию, и ...такие переменные надо возвращать через функцию, и все будет пучком<br /><br />bar& foo() { static bar& v; return v; }Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-91543266512635773022011-07-18T17:34:38.212+04:002011-07-18T17:34:38.212+04:00Подскажите, пожалуйста, альтернативу глобальным ст...Подскажите, пожалуйста, альтернативу глобальным статическим переменным в следующей ситуации.<br /><br />Классы биндятся в скрипт. Каждый класс знает о том, какие его члены нужно связать. Само связывание происходит в свободной функции а ее вызов идет с помощью примерно такого кода:<br />const bool is_registered = BindFunction()<br /><br />Если вызывать эти функции для каждого класса вручную в стороннем модуле, то получается не так "красиво" чтоли...<br /><br />Также, отдельно есть следующая проблема:<br />- если поместить этот код в *.h файлы, то он вызовется многократно, что является излишним<br />- если же его поместить *.cpp файлы, то нет гарантии что он будет вызван вообще и я не знаю как сделать этот вызов гарантированным<br /><br />Заранее спасибо и извините что в формате вопроса, хотя думаю информация по теме и может быть кому-то интересна.Александрnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-53119515716307198062011-07-13T15:00:49.766+04:002011-07-13T15:00:49.766+04:00скажу банальную вещь, но при разработке встраиваем...скажу банальную вещь, но при разработке встраиваемых систем я не доверяю даже тому, что по стандарту глобальные переменные инициализируются нулями, просто потому что я могу подменить стартап-код. В результате все глобальные переменные я инициализирую (даже нулями) при помощи *_init() функций из каждого модуля. Может ли этот подход решить конкретную описанную проблему я на 100% не уверен, но по крайней мере это может оказаться минимальным workaround.bialixhttps://www.blogger.com/profile/03276301722234350242noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-80935189620662298812011-07-13T10:16:12.338+04:002011-07-13T10:16:12.338+04:00Qehgt
Глобальные переменные в коде - признак низко...<b>Qehgt</b><br /><i>Глобальные переменные в коде - признак низкого качества кода.</i><br /><i>Исправить/зарефакторить - религия не позволяет?</i><br /><br />Если проект большой, то его полный рефакторинг - серьезная ответственность. Не все могут ее на себя взять. Плюс надо убедить менеджмент, а менеджмент бывает разный. Плюс может не быть специалистов, которые могут провести такой рефакторинг.<br /><br /><b>Великобратов Максим </b><br /><i>А я вообще не понимаю, что можно писать, чтобы сесть в такую лужу?</i><br /><br />Это только в форумах все специалисты без страха и упрека. В реальных проектах люди ошибаются. <br /><br /><b>Максим Моторный</b><br /><i>Алена, а внедрение зависимостей не стали использовать?</i><br /><br />Никогда не использовала, нет.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-59573404684266572152011-07-13T03:09:12.462+04:002011-07-13T03:09:12.462+04:00Алена, а внедрение зависимостей не стали использов...Алена, а внедрение зависимостей не стали использовать?Maksym Motornyyhttps://www.blogger.com/profile/10897433874042751198noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-39380817690374232422011-07-13T00:19:15.329+04:002011-07-13T00:19:15.329+04:00А я вообще не понимаю, что можно писать, чтобы сес...А я вообще не понимаю, что можно писать, чтобы сесть в такую лужу?Anonymoushttps://www.blogger.com/profile/07750222788189134402noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-51852817183856181792011-07-12T20:55:01.695+04:002011-07-12T20:55:01.695+04:00Есть довольно простой обходной путь, который не тр...Есть довольно простой обходной путь, который не требует глобального рефакторинга: http://altdevblogaday.com/2011/07/07/writing-a-pre-main-function-forcing-global-initialization-order-within-vc/Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-65802218774367113642011-07-12T20:52:07.884+04:002011-07-12T20:52:07.884+04:00не только инициализироваться, но и удаляться в про...не только инициализироваться, но и удаляться в произвольном порядке при завершении программы - тоже может боком вылезти... мы наткнулись на такое на gcc 4.6Alex Otthttps://www.blogger.com/profile/13001951608173211050noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-10894381348961936302011-07-12T20:34:31.556+04:002011-07-12T20:34:31.556+04:00Чтобы этого не происходило, стараюсь использовать ...Чтобы этого не происходило, стараюсь использовать минимум глобальных переменных и держать их в одной единице трансляции, специально для этого отведенной. В частности, это естественным образом умеряет желание создавать глобальные переменные.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-3918051781751433702011-07-12T20:28:29.314+04:002011-07-12T20:28:29.314+04:00По моему единственный случай когда оправдано испол...По моему единственный случай когда оправдано использование статических переменных, - это реализация thread local storage.<br /><br />Остальное все должно начинаться со стека int main(); и неторопливо уходить в heap.Anonymoushttps://www.blogger.com/profile/04528258476387917949noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-33895432830193789072011-07-12T20:26:37.600+04:002011-07-12T20:26:37.600+04:00Помимо синглтона, есть ещё паттерн «счётчик Шварца...Помимо синглтона, есть ещё паттерн «счётчик Шварца».Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-40325962038698767582011-07-12T19:50:58.301+04:002011-07-12T19:50:58.301+04:00И именно поэтому паттерн "singleton" пол...И именно поэтому паттерн "singleton" получил такую популярность. ;)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-34752849932201878712011-07-12T19:28:55.040+04:002011-07-12T19:28:55.040+04:00Глобальные переменные в коде - признак низкого кач...Глобальные переменные в коде - признак низкого качества кода.<br /><br />Исправить/зарефакторить - религия не позволяет?Qehgthttps://www.blogger.com/profile/13293619483296242978noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-36651328751641076002011-07-12T19:20:40.757+04:002011-07-12T19:20:40.757+04:00ого, это ж подводные грабли как они есть! примерно...ого, это ж подводные грабли как они есть! примерно как в моей епархии все, что связано с альфа-каналамиSherehttps://www.blogger.com/profile/04101901484992724574noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-59429971842660800222011-07-12T19:18:29.127+04:002011-07-12T19:18:29.127+04:00Алёна работает в Miscrosoft. Я думаю, что они не и...Алёна работает в Miscrosoft. Я думаю, что они не используют gcc в своих проектах.<br />Про -100 согласен на все 100.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-8618584026341787002011-07-12T18:33:07.792+04:002011-07-12T18:33:07.792+04:00Если не боитесь темной стороны силы, в gcc есть сп...Если не боитесь темной стороны силы, в gcc есть способ определить порядок (priority) инициализации. http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html <br /><br />но минус сто в карму сразу.Anonymousnoreply@blogger.com