Поскольку он помечен как «встроенный», я предполагаю, что он применяется для встроенных систем?
В этом случае основное различие между C и C ++ заключается в том, как C ++ обрабатывает структуры.Все структуры будут обрабатываться как классы, что означает, что они будут иметь конструкторы.
Все экземпляры структур / классов, объявленные в области видимости файла или как статические, будут вызывать свои конструкторы перед выполнением main () аналогичным образом.к статической инициализации, которая у вас уже есть, независимо от того, C или C ++.
Все эти вызовы конструктора при загрузке являются основным недостатком эффективности для встроенных систем, где код находится в NVM, а не в RAM.Так же, как статическая инициализация, она создаст некрасивый, нежелательный пик рабочей нагрузки в начале программы, когда значения из NVM копируются в ОЗУ.
В C / C ++ есть способы обойти статическую инициализацию: большинствовстроенные компиляторы имеют возможность отключить его.Но так как это нестандартная установка, весь код, использующий статику, должен быть написан так, чтобы он никогда не использовал какие-либо значения инициализации, а вместо этого устанавливал все статические переменные во время выполнения.
Но, насколько мне известно, нет способа обойти конструкторов без нарушения стандарта.
РЕДАКТИРОВАТЬ: Вот исходный код, выполненный в одной такой системе C ++, Freescale HCS08 Codewarrior 6.3.Этот код внедряется в пользовательскую программу после статической инициализации, но перед выполнением main ():
static void Call_Constructors(void) {
int i;
...
i = (int)(_startupData.nofInitBodies - 1);
while (i >= 0) {
(&_startupData.initBodies->initFunc)[i](); /* call C++ constructors */
i--;
}
...
По крайней мере, этот служебный код должен выполняться при запуске программы, независимо от того, насколько эффективен компиляторнаходится при преобразовании конструкторов в статическую инициализацию.