169 похожих чатов

Если у меня 2 переменных: int a =5; int b = 7; То

в стеке сначало будет b потом a или наоборот?

46 ответов

9 просмотров

В стеке ли?

BARSIS- Автор вопроса

да где угодно, исходя из этих строк кода

BARSIS
Да

Смотря где они определены )

Зависит от компилятора, режима оптимизации, других переменных, кода вокруг, фазы луны… Например у int foo(void) { int a = 5, b = 7; return a + b; } с -O3 вообще никаких переменных не будет.

Почему в стеке? В секции данных будут они Хотя, если они определены как локальные переменные, тогда в стеке

CLFLUSH 🇷🇺 rdseed
Почему в стеке? В секции данных будут они Хотя, е...

не факт. а еще, как заметили выше, они вообще могут отсутвтвовать

BARSIS
Почему?

Потому что две константы. будет mov eax, 12 ret

Aiwan \ (•◡•) / _bot
не факт. а еще, как заметили выше, они вообще могу...

Ну думаю сейчас речь про то, что они присутствуют. А иначе какой смысл?

BARSIS
глобальные

Ну вот с глобальными скорее всего ничего не случится, будут в том порядке, в котором определены.

BARSIS- Автор вопроса
s54820
Ну вот с глобальными скорее всего ничего не случит...

Но я часто читал что они распределены как тарелки туда сюда, это все чушь?

BARSIS
Но я часто читал что они распределены как тарелки ...

Думаю в данном случае, если они как глобальные определены, тогда компилятор просто сначала a потом b положит, т.к будет построчно обрабатывать код. В других случаях, при другом размере переменных, можно было бы сказать, что при char[] int Сначала будет int, потом char[] из-за выравнивания по границе

BARSIS- Автор вопроса
BARSIS
Но я часто читал что они распределены как тарелки ...

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

BARSIS
Это и от типа данных зависит что ли?

От выравнивания. Просто секция изначально выравнена по 4-х байтной (или 8-байтной границе), и легче положить туда int, и не выравнивать nop'ами, чем положить char с выравниванием на 1, а потом выравнивать на 4, и ложить int

BARSIS- Автор вопроса
s54820
Да, стек именно так и работает, но обычно у тебя т...

Скажите плиз где все я могу подробно прочитать

s54820
Так нулями же :)

Да, верно. Можно и нулями

BARSIS- Автор вопроса
s54820
Так нулями же :)

Я часто вижу что процессор заполняет нулями свободное пространство для выравнивание данных, вы про это?

BARSIS
Я часто вижу что процессор заполняет нулями свобод...

Процессор не заполняет, он вообще без спроса не трогает ничего. Это ОС требует от формата файла, в PE поля SectionAlignment, FileAlignment.

CLFLUSH 🇷🇺 rdseed
Думаю в данном случае, если они как глобальные опр...

Смотри-ка, gcc и правда сортирует, чтобы минимизировать дыры. А clang нет. Хотя нет, просто повезло, там порядок от имени и хэштаблицы зависит, видимо.

BARSIS
что вы имели введу ?

до мэйн или после, испольщуются ли переменые в коде, имеется ли оптимизация

s54820
Смотри-ка, gcc и правда сортирует, чтобы минимизир...

Почему же? Вроде при разных вариантах, char всегда на последнем, int на втором, double на первом

CLFLUSH 🇷🇺 rdseed
Почему же? Вроде при разных вариантах, char всегда...

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

BARSIS- Автор вопроса
mur@dm
Всм?

Всмысле

BARSIS
Всмысле

А ну там следом же ответили, что зависит от многих факторов, я не стал повторяться )

место имение рейверы
А хештаблица как влияет?

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

s54820
Я добавил ещё 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

BARSIS
VBOX например?

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

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
52
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
я не понимаю mov [r11+8],rcx и прочие. мы записываем значение из rcx, куда?
Bor
15
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
А какие расширения активно используются в промышленности? Именно идейные, по типу гадт, а не всякие оверлоадедстрингс
Степан
11
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
Guys Who’s kurdish on this group?
Hiwa Amiri
11
Карта сайта