Информация об изменениях

Сообщение Re[8]: Самый низкоуровневый язык, ага от 07.10.2023 14:02

Изменено 07.10.2023 14:14 vsb

Re[8]: Самый низкоуровневый язык, ага
Здравствуйте, vdimas, Вы писали:

V>>>Если пользуешь Си, то для оперирования объявленными статическими данными (структурами, массивами) необходим CRT.

M>>Что именно из CRT нужно для этого?

V>Двухфазная инициализация глобальных данных.

V>Причём, при внешнем загрузчике CRT обыгрывает только вторую фазу (динамической инициализации), а в гарварде CRT обыгрывает обе фазы.

V>Упреждая пинг-понг вопросов-ответов:

V>
V>int a = 42;
V>int b = calcB();
V>

V>Здесь в бинарном образе в сегменте данных по адресу a будет число 42, по адресу b будет 0.

V>Внешний загрузчик грузит образ в память, переменная a уже инициализирована (это первая фаза), а переменная b будет инициализирована из глобального связанного списка инициализации, где каждый узел примерно такого вида:

V>
V>struct __init_module {
V>  void (*fn)(void);
V>  __init_module * next; 
V>};
V>

V>CRT пробегается по этому списку, вызывая код динамической инициализации — это вторая фаза стандартной инициализации С/С++.

V>Для инициализации модуля, содержащего динамическую инициализацию (здесь глобальной переменной b), будет порождена безымянная ф-ия примерно такого вида:

V>
V>void __some_init_xxx() {
V>  b = calcB();
V>}
V>

V>Указатель на эту ф-ию будет в одном из узлов __init_module в глобальном списке динамической инициализации.

V>Для микриков обычно нет связанного списка, динамическая инициализация представляет собой развернутый (типа заинлайненный) код, но это всё-равно лишний код, который почти всегда не нужен, т.к. любые начальные данные или не нужны, или являются константами, тогда им не место в ОЗУ.


Честно говоря я ничего не понял. Можно пример минимальной компилируемой программы? Глобальные переменные нельзя инициализировать чем-либо кроме констант. Константы идут в .data и всё, без всяких init.


[ccode]
int calcB();

int a = 42;
int b = calcB();
[/code]

Этот код не компилируется: error: initializer element is not constant
Re[8]: Самый низкоуровневый язык, ага
Здравствуйте, vdimas, Вы писали:

V>>>Если пользуешь Си, то для оперирования объявленными статическими данными (структурами, массивами) необходим CRT.

M>>Что именно из CRT нужно для этого?

V>Двухфазная инициализация глобальных данных.

V>Причём, при внешнем загрузчике CRT обыгрывает только вторую фазу (динамической инициализации), а в гарварде CRT обыгрывает обе фазы.

V>Упреждая пинг-понг вопросов-ответов:

V>
V>int a = 42;
V>int b = calcB();
V>

V>Здесь в бинарном образе в сегменте данных по адресу a будет число 42, по адресу b будет 0.

V>Внешний загрузчик грузит образ в память, переменная a уже инициализирована (это первая фаза), а переменная b будет инициализирована из глобального связанного списка инициализации, где каждый узел примерно такого вида:

V>
V>struct __init_module {
V>  void (*fn)(void);
V>  __init_module * next; 
V>};
V>

V>CRT пробегается по этому списку, вызывая код динамической инициализации — это вторая фаза стандартной инициализации С/С++.

V>Для инициализации модуля, содержащего динамическую инициализацию (здесь глобальной переменной b), будет порождена безымянная ф-ия примерно такого вида:

V>
V>void __some_init_xxx() {
V>  b = calcB();
V>}
V>

V>Указатель на эту ф-ию будет в одном из узлов __init_module в глобальном списке динамической инициализации.

V>Для микриков обычно нет связанного списка, динамическая инициализация представляет собой развернутый (типа заинлайненный) код, но это всё-равно лишний код, который почти всегда не нужен, т.к. любые начальные данные или не нужны, или являются константами, тогда им не место в ОЗУ.


Честно говоря я ничего не понял. Можно пример минимальной компилируемой программы? Глобальные переменные нельзя инициализировать чем-либо кроме констант. Константы идут в .data и всё, без всяких init.


int calcB();

int a = 42;
int b = calcB();


Этот код не компилируется: error: initializer element is not constant