то сколько выделится памяти под массив? Зависит от компилятора?
Я предполагаю, что выделится ровно столько, сколько элементов перечислено в списке (т. е. sizeof(тип) * количество элементов в списке).
Я предполагаю, что выделится ровно столько, сколько элементов перечислено в списке
Совершенно верно за одним исключением. Памяти может выделятся чуть больше из-за выравнивания. Доступ к памяти по выровненным адресам намного быстрее происходит, из-за чего эффективнее например выделить дополнительный байт в начале (что бы адрес массива стал кратным 2/4/8/16 (смотря какое выравнивание в архитектуре используется).
dableproger: возможно попробовать перед массивом объявить переменную и вычислить разность адреса массива и адреса переменной и ещё отнять размер переменной. Получите размер неиспользуемого места перед массивом.
Вот только я не уверен, гарантирует ли компилятор определённый порядок переменных. В структурах гарантирует точно.
fshp: гарантирует. В обеих случаях. И на стеке и на куче.
Вот только в случае со стеком - они будут в обратном порядке. Стек растет в сторону уменьшения адресов, то есть более "поздняя" переменная выделится в стеке "выше", т.е по адресам она будет раньше.
Связано это с тем, что локальные переменные на стеке выделяются через вычитание требуемой памяти из указателя на вершину стека, и добавление инициализированных переменных через push до этого, которая кладет их "сверху" стека.
SolidMinus: на куче точно не гарантирует, т.к. память может быть фрагментирована. И если первое выделение не помещается в первый фрагмент, а второе помещается - то адреса будут в обратном порядке.
MiiNiPaa: переменные на которые есть reference в коде удалить он не может, он может их оптимизировать в использование регистрами, в примере он их удалил потому что дабл нигде не используется, але)))
Но если в коде будет оператор & перед именем переменной - в регистр он ее не запихнет, т.к у регистров нет адреса в памяти.
Изменение порядка такое связано с тем, что double занимает памяти больше чем int, поэтому сначала пушится инт, потом дабл. Имелось ввиду переменные одного типа.
Ты лучше не адреса выводи через принтф, а дизассемблируй мейн функцию и смотри как что меняется там...
sizeof(type) * N, где type - тип, а N - количество элементов, плюс к этому числу добавляется количество байт до такого числа, чтобы оно было кратно выравниванию, как сказали выше.
Проще говоря, занимает столько, сколько занимает N таких элементов ( для int - 4N байт ) и это число округляется в верхнюю сторону до числа, чтобы было кратным некоторому числу K. Это число K и есть выравнивание, задается в настройках компилятора.
Нужно выравнивание, чтобы процессору проще вычислять было. Он гораздо проще работает с числами кратными степени двойки.