#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: для автоматических переменных порядок распределения определяет , какая часть стека?