оптимизация инициализации глобальной переменной - PullRequest
0 голосов
/ 12 марта 2012

Глобальные переменные инициализируются в «0» по умолчанию.

Какая разница (если таковая имеется), когда я явно присваиваю ему значение «0».

Является ли какой-либо из них быстрее / лучше / более оптимизированным?

Я пробовал с небольшим примером программы .c, но я не вижу никаких изменений в размере исполняемого файла.

Редактировать: 0 Я просто хочу понять поведение.Это не узкое место для меня в любом случае.

Ответы [ 5 ]

5 голосов
/ 12 марта 2012

Ответ на ваш вопрос зависит от конкретной реализации, но обычно все неинициализированные глобальные и статические переменные попадают в сегмент .bss . Явно инициализированные переменные находятся в некотором другом сегменте данных . Оба они будут скопированы загрузчиком программы перед выполнением main(). Таким образом, не должно быть никакой разницы в производительности между явной инициализацией в ноль и оставлением переменной неинициализированной.

IMO. Хорошей практикой является явная инициализация глобальных и статических данных на ноль, поскольку это дает понять, что ожидается нулевое начальное значение.

2 голосов
/ 12 марта 2012

Статические объекты без явного инициализатора инициализируются нулем при запуске. Независимо от того, явно ли вы инициализировали объект 0 или нет, это не повлияет на производительность, так как компилятор обычно инициализирует все нулевые объекты за один раз до main.

// File scope
// Same code is likely to be generated for the two objects initialization

int bla1;
int bla2 = 0;   

С другой стороны, если вместо инициализации назначить 0, это может иметь значение, поскольку компилятор не сможет определить, какое значение было предыдущим для объекта.

void init(void)
{
    bla1 = 0;
    bla2 = 0;
} 
2 голосов
/ 12 марта 2012

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

Однако более серьезный вопрос - есть ли конкретная причина, по которой вы пытаетесь оптимизировать с помощью инициализации глобальных переменных. Не могли бы вы объяснить немного больше.

1 голос
/ 12 марта 2012

Там нет ни одного. Оптимизатор видит это как запрет.

Явная инициализация более многословна и понятна неопытному глазу. Если в вашей команде есть юниоры, я бы явно инициализировал эти переменные.

1 голос
/ 12 марта 2012

Я сомневаюсь, что есть разница, но, даже если и есть, у меня гораздо больше сомнений в том, что ваша программа настолько оптимизирована, что узким местом является то.

Я бы предпочел не делать этогозаботьтесь обо всех подобных проблемах и пишите код по своему усмотрению, возможно, уступая место удобочитаемости, а не скорости, оставляя оптимизацию только как последнюю проблему.

Преждевременная оптимизация - корень всего зла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...