Я читал эту замечательную статью о макете памяти программ C. В нем говорится, что инициализированные глобальные переменные по умолчанию находятся в сегменте BSS, и если вы явно предоставляете значение глобальной переменной, то оно будет находиться в .
Я тестировал следующие программы на C и С++ для изучения этого поведения.
#include <iostream>
// Both i and s are having static storage duration
int i; // i will be kept in the BSS segment, default initialized variable, default value=0
int s(5); // s will be kept in the data segment, explicitly initialized variable,
int main()
{
std::cout<<&i<<' '<<&s;
}
Вывод:
0x488020 0x478004
Итак, из вывода видно, что как переменная i, так и s находятся в совершенно разных сегментах. Но если я удалю инициализатор (начальное значение 5 в этой программе) из переменной S, а затем запустил программу, он даст мне следующий результат.
Вывод:
0x488020 0x488024
Итак, из вывода видно, что обе переменные я и s находятся в одном и том же сегменте (в данном случае BSS).
Это поведение также совпадает с C.
#include <stdio.h>
int i; // i will be kept in the BSS segment, default initialized variable, default value=0
int s=5; // s will be kept in the data segment, explicitly initialized variable,
int main(void)
{
printf("%p %p\n",(void*)&i,(void*)&s);
}
Вывод:
004053D0 00403004
Итак, снова мы можем сказать, посмотрев на результат (средство изучения адреса переменных), и переменная я и s находится в совершенно разных сегментах. Но опять же, если я удаляю инициализатор (начальное значение 5 в этой программе) из переменной S, а затем запускаю программу, он дает мне следующий результат.
Вывод:
004053D0 004053D4
Итак, из вывода видно, что обе переменные я и s находятся в одном и том же сегменте (в данном случае BSS).
Почему компиляторы C и С++ помещают явно инициализированные и инициализированные по умолчанию глобальные переменные в разных сегментах? Почему существует различие в том, где находится глобальная переменная между инициализированными и явно инициализированными переменными по умолчанию? Если я не ошибаюсь, стандарты C и С++ никогда не говорят о стеке, куче, сегменте данных, сегменте кода, сегменте BSS и обо всех таких вещах, которые специфичны для реализации. Итак, возможно ли, чтобы реализация С++ сохраняла явно инициализированные и инициализированные по умолчанию переменные в тех же сегментах, а не сохраняла их в разных сегментах?