в стеке сначало будет b потом a или наоборот?
В стеке ли?
да где угодно, исходя из этих строк кода
Зависит от компилятора, режима оптимизации, других переменных, кода вокруг, фазы луны… Например у int foo(void) { int a = 5, b = 7; return a + b; } с -O3 вообще никаких переменных не будет.
Почему в стеке? В секции данных будут они Хотя, если они определены как локальные переменные, тогда в стеке
не факт. а еще, как заметили выше, они вообще могут отсутвтвовать
Потому что две константы. будет mov eax, 12 ret
Ну думаю сейчас речь про то, что они присутствуют. А иначе какой смысл?
Ну вот с глобальными скорее всего ничего не случится, будут в том порядке, в котором определены.
Но я часто читал что они распределены как тарелки туда сюда, это все чушь?
Думаю в данном случае, если они как глобальные определены, тогда компилятор просто сначала a потом b положит, т.к будет построчно обрабатывать код. В других случаях, при другом размере переменных, можно было бы сказать, что при char[] int Сначала будет int, потом char[] из-за выравнивания по границе
Это и от типа данных зависит что ли?
Да, стек именно так и работает, но обычно у тебя так будут лежать целые кадры стека, а не отдельные переменные. Отдельные переменные будут только в стековых вм типа джавы.
От выравнивания. Просто секция изначально выравнена по 4-х байтной (или 8-байтной границе), и легче положить туда int, и не выравнивать nop'ами, чем положить char с выравниванием на 1, а потом выравнивать на 4, и ложить int
Скажите плиз где все я могу подробно прочитать
Нопами? В секции данных? А зачем?
Чтобы выровнять
Так нулями же :)
Да, верно. Можно и нулями
Я часто вижу что процессор заполняет нулями свободное пространство для выравнивание данных, вы про это?
Процессор не заполняет, он вообще без спроса не трогает ничего. Это ОС требует от формата файла, в PE поля SectionAlignment, FileAlignment.
Смотри-ка, gcc и правда сортирует, чтобы минимизировать дыры. А clang нет. Хотя нет, просто повезло, там порядок от имени и хэштаблицы зависит, видимо.
что вы имели введу ?
до мэйн или после, испольщуются ли переменые в коде, имеется ли оптимизация
Почему же? Вроде при разных вариантах, char всегда на последнем, int на втором, double на первом
Я добавил ещё char, один попал вверх, другой вниз, хотя по логике они должны были последовательно разместиться, а ещё лучше вплотную.
Всм?
Всмысле
А ну там следом же ответили, что зависит от многих факторов, я не стал повторяться )
А хештаблица как влияет?
Я не знаю. Может быть, оно в каком порядке проходит, в таком и генерирует. А порядок прохода зависит от имени. Просто предположение.
Похоже GCC расставляет в зависимости от использования для функции. static int a = 2; static double c = 23.0; static char b[] = "12"; static char d[] = "123"; printf("int=%X, char=%X, double=%X, char=%X \n", &a, &b, &d, &c); objdump выдаёт такой порядок: 00004020 l O .data 00000008 c.0 00004028 l O .data 00000004 d.1 0000402c l O .data 00000003 b.2 00004030 l O .data 00000004 a.3 То есть тут разместилось нормально, два char вплотную. А если изменить строку вывода на: &a, &b, &c, &d Тогда соответственно &d будет первым, &c вторым, &b третьим, &a последний. То есть между char b и d встал double c
а что такое вм?
Виртуальная машина
Нет, другого рода. VirtualBox эмулирует реальный компьютер, а вм джавы специально создана для выполнения байткода джавы и аппаратного прототипа не имеет.
Это виртуальная машина из другой категории
Да, хорошая идея. Может быть и так.
Вот тут уже был похожий ответ даже))
Обсуждают сегодня