Ответ 1
Нет, поскольку стандарт С++ (и C) говорит, что все глобальные/статические переменные, которые явно не инициализируются программистом, должны быть инициализированы до нуля. Такие переменные помещаются в специальный сегмент .bss
. Они инициализируются до нуля до вызова main().
Если вы инициализируете свой глобальный/статический явно, но до значения 0, компилятор достаточно умен, чтобы реализовать это и по-прежнему помещать его в сегмент bss
.
Вы можете проверить это для себя следующим примером:
#include <stdio.h>
static int uninit;
static int init_zero=0;
static int init_one=1;
int main (void)
{
printf("%p\n", &uninit);
printf("%p\n", &init_zero);
printf("%p\n", &init_one);
return 0;
}
В этом примере переменные uninit
и init_zero
будут попадать в соседние адреса памяти (вероятно, 4 байта друг от друга), так как они оба находятся в сегменте .bss
. Но переменная init_one
закончится где-то еще полностью, потому что она выделена в сегменте .data
.