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

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

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

46 ответов

19 просмотров

В стеке ли?

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 эмулирует реальный компьютер, а вм джавы специально создана для выполнения байткода джавы и аппаратного прототипа не имеет.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта