Глобальная переменная 0-инициализированный штраф

Это очень простой вопрос:

Имеет ли 0-инициализация глобальных и статических переменных какое-либо ограничение производительности (хотя и очень маленькое) во время выполнения?

Ответ 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.

Ответ 2

Расширение вопроса от 0-инициализации (которая является всего лишь подмножеством) инициализации по умолчанию, мы все же можем заключить, что она обычно не оказывает заметного влияния на производительность приложения. Тем не менее, легко спроектировать класс, который будет выполнять, например, поиск базы данных в конструкторе, что приводит к интересным эффектам, заметным во время запуска приложения.