#новичкам
Внимательные читатели 2-х последних постов могут задаться вопросом: "Почему в неинициализированных локальных переменных лежит мусор, а в глобальных - нули? Откуда такие двойные стандарты?".
Можно конечно сказать, что такие двойные стандарты определены в стандарте С++ и на этом можно закончить.
Ответ, как и в случае с локальными переменными, лежит за пределами языка.
int i;
int main() {
std::cout << i << std::endl;
}
// OUTPUT is always
// 0
Все пошло от языка С. Там глобальные переменные занулялись, поэтому для совместимости с С С++ также перенял эту особенность.
"Это конечно хорошо, но на вопрос вы так и не ответили, а только стрелками кидаетесь."
Это был важный переход, который и приведет нас к ответу.
Язык С зарождался исходя из потребностей развития операционной системы Unix. Поэтому некоторые особенности ОС интегрировались в язык.
Конкретно неинициализированные глобальные переменные в Unix хранятся в сегменте глобальной памяти .bss . При запуске программы ОС выделяла память под программу. Для сегмента bss ядру нужно было выделить участок памяти запрошенного размера. Но что должно было лежать в этой памяти? По соображениям безопасности и изоляции процессов ядро не могло отдать программе память с остаточными данными от предыдущих процессов. Самый простой и эффективный способ гарантировать это — заполнить выделенную память нулями.
И программисты на С стали естественным образом пользоваться этой особенностью: неинициализированные глобальные переменные занулялись.
Когда пришло время стандартизации С, то обнуление глобальных переменных органично перекочевало в стандарт языка.
Вот так обнуление стало стандартом С, а затем и С++.
Understand the root cause. Stay cool.
#cppcore #os