Что это за «язык» (находится в файле .csv, может быть, в листе Excel)?

По статическим и глобальным объектам я предполагаю, что вы имеете в виду объекты со статическим временем жизни, определенные в области пространства имен. Когда такие объекты определены с локальной областью, правила немного отличаются.

Формально C ++ инициализирует такие переменные в три этапа: 1. Инициализация нуля 2. Статическая инициализация 3. Динамическая инициализация Язык также различает переменные, которые требуют динамической инициализации, и те, которые требуют статической инициализации: все статические объекты (объекты со статическим временем жизни) сначала инициализируются нулем, затем инициализируются объекты со статической инициализацией, а затем происходит динамическая инициализация.

В качестве простого первого приближения динамическая инициализация означает, что должен выполняться некоторый код; обычно статическая инициализация не выполняется. Таким образом:

extern int f();

int g1 = 42;    //  static initialization
int g2 = f();   //  dynamic initialization

Другое приближение было бы в том, что статическая инициализация - это то, что поддерживает C (для переменных со статическим временем жизни), динамическое все остальное.

Как это зависит от компилятора, конечно, при инициализации, но на дисковых системах, где исполняемый файл загружается в память с диска, значения для статической инициализации являются частью образа на диске и загружаются непосредственно системой с диска. В классической системе Unix глобальные переменные будут разделены на три «сегмента»:

текст:
Код, загруженный в защищенную от записи область. Здесь также будут размещены статические переменные с типами `const`.
data:
Статические переменные со статическими инициализаторами.
bss:
Статические переменные без инициализатора (C и C ++) или с динамической инициализацией (C ++). Исполняемый файл не содержит изображения для этого сегмента, и система просто устанавливает все значение `0` перед началом кода.

Я подозреваю, что многие современные системы все еще используют что-то подобное.

EDIT:

Еще одно замечание: вышеупомянутое относится к C + +03. Для существующих программ C ++ 11, вероятно, ничего не меняет, но он добавляет constexpr (что означает, что некоторые пользовательские функции могут по-прежнему являться статической инициализацией) и локальные переменные потока, что открывает совершенно новую банку червей .

0
задан Phantom 15 July 2014 в 13:33
поделиться