Могут ли компиляторы изменять порядок объявлений?

#c #standards

#c #стандарты

Вопрос:

В таком объявлении, как int i, v[5], j; , например, как будут распределяться переменные? Разрешено ли компилятору изменять их порядок?

Комментарии:

1. Как всегда, почему? Если вы хотите зависеть от (относительного) (стека?) местоположения, используйте структуру и offsetof группируйте переменные. В противном случае выполните компиляцию с использованием отладочной информации и получите точную компоновку стека из отладочной информации

2. @sehe У всего должна быть причина? Я просто хочу знать. 🙂

3. Да -да. Если ответ положительный, то у компилятора есть на то причина. Если ответ отрицательный, то у компилятора / стандарта есть причина. Именно по этой причине вы, по сути, задаете вопросы для себя. Вы не можете плюнуть на рациональный анализ, если вам нужны факты.

Ответ №1:

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

(обратите внимание, что компилятор не может изменять порядок переменных внутри структуры)

Ответ №2:

Да, компилятор может (и будет) изменять порядок. Порядок зависит от компилятора и не указан в стандартах C. Стандарты C даже не указывают, что стек должен существовать.

Комментарии:

1. Порядок сохраняется в структурах, хотя выравнивание и заполнение могут быть добавлены.

Ответ №3:

Компилятору разрешено размещать их практически везде, где он хочет.

Комментарии:

1. Я думаю, что OP спрашивает о последовательности выделения, а не о том, в какой части стека.

2. Я полагаю, в C это будет включать инициализацию (при условии, что инициализация не зависит от внешних факторов)

3. @Mahesh: для автоматических переменных порядок распределения определяет , какая часть стека?