Почему стак в майнкрафте именно 64
Перейти к содержимому

Почему стак в майнкрафте именно 64

  • автор:

Why Stacks of 64?

Hello everybody. Today I’m posting something that’s probably crossed every old minecrafter’s mind at some point, though they don’t put much thought into it. (I didn’t, at least) Anyways, Minecraft, as you all know, is very creative and different. One of the interesting parts of Minecraft is why the stacks are 64. Usually a game designer would make it 100 or an even number such as that. (I’m well aware that 64’s an even number) So I’m posting a topic about why you guys think that Notch decided to make a stack 64, and why Jeb kept it that way.

Почему в майнкрафте стак это 64

В форумах люди часто упоминают, что 64-битные версии программ поглощают больший объем памяти и стека. При этом обычно ссылаются на то, что размеры данных стали в 2 раза больше. Однако это необоснованное утверждение, так как размер большинства типов (char, short, int, float) в языке Си/Си++ остался прежним на 64-битных системах. Конечно, например, увеличился размер указателей, но ведь не все данные в программе состоят из указателей. Причины роста потребляемой памяти и стека более сложны. Я решил подробнее исследовать данный вопрос.

В данной заметке я поговорю о стеке, а в будущем планирую обсудить выделение памяти и размер двоичного кода. И еще хочу сразу заметить, что статья посвящена языку Си/Си++ и среде разработки Visual Studio.

До недавнего времени я считал, что код 64-битной программы может поглощать стек не быстрее чем в два раза по сравнению с 32-битным кодом. Основываясь на этом предположении, я рекомендовал в статьях на всякий случай увеличивать стек программы в два раза. Однако теперь я выяснил неприятный факт. Поглощение стека может вырасти существенно больше чем в два раза. Я был удивлен, поскольку ранее считал рост стека в два раза самым пессимистическим вариантом развития событий. Причина моих необоснованных надежд станет понятна чуть позже. Рассмотрим теперь, как в 64-битной программе передаются параметры при вызове функций.

Соглашение по вызовам на платформе x86-64 похоже на соглашение fastcall, существующее в x86. В x64-соглашении первые четыре целочисленных аргумента (слева направо) передаются в 64-битных регистрах, выбранных специально для этой цели:

RCX: 1-й целочисленный аргумент
RDX: 2-й целочисленный аргумент
R8: 3-й целочисленный аргумент
R9: 4-й целочисленный аргумент

Из этой информации я ранее сделал вывод, что 64-битная программа во многих случаях может экономить стековую память по сравнению с 32-битной. Ведь если параметры передаются через регистры, код функции короткий и нет необходимости сохранять аргументы в памяти (стеке), то размер используемой стековой памяти должен сократиться. Но это не так.

Хотя аргументы могут быть переданы в регистрах, компилятор все равно резервирует для них место в стеке, уменьшая значение регистра RSP (указателя стека). Как минимум, каждая функция должна резервировать в стеке 32 байта (четыре 64-битных значения, соответствующие регистрам RCX, RDX, R8, R9). Это пространство в стеке позволяет легко сохранить содержимое переданных в функцию регистров в стеке. От вызываемой функции не требуется сбрасывать в стек входные параметры, переданные через регистры, но резервирование места в стеке при необходимости позволяет это сделать. Если передается более четырех целочисленных параметров, в стеке нужно зарезервировать соответствующее дополнительное пространство.

Рассмотрим пример. Некая функция передает два целочисленных параметра дочерней функции. Компилятор положит значения аргументов в регистры RCX и RDX и при этом вычтет 32 байта из регистра RSP. Вызываемая функция может обратиться к параметрам через регистры RCX и RDX. Если же коду этой функции данные регистры понадобятся для какой-то иной цели, он сможет скопировать их содержимое в зарезервированное пространство стека размером 32 байта.

Обратим внимание еще на один момент. Указатель стека RSP должен перед очередным вызовом функции быть выровнен по границе 16 байт. Таким образом, суммарный размер используемого стека при вызове в 64-битном коде функции без параметров составляет: 8 (адрес возврата) + 8 (выравнивание) + 32 (резерв для аргументов) = 48 байт!

Рассмотрим, к чему это может приводить на практике. Здесь и далее для экспериментов я буду использовать Visual Studio 2010. Составим рекурсивную функцию вида:

Release 32-bit: последнее выведенное число (глубина стека) — 51331
Компилятор использует при вызове данной функции 20 байт.

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Release 64-bit: последнее выведенное число — 21288
Компилятор использует при вызове данной функции 48 байт.

Таким образом, 64-битный вариант функции StackUse оказывается прожорливее 32-битного в более чем в 2 раза.

Замечу, что изменение правил выравнивания данных также может оказывать влияние на размер поглощаемого стека. Предположим, что функция принимает в качестве аргумента структуру:

Размер структуры ‘S’ из-за изменений правил выравнивания и изменения размера члена ‘b’ вырастет с 12 до 24 байт при перекомпиляции в 64-битном режиме. Структура передается в функцию по значению. А, следовательно, структура в стеке также займет в два раза больше памяти.

Неужели все так плохо? Нет. Не следует забывать про большее количество регистров имеющихся в распоряжении 64-битного компилятора. Усложним код экспериментальной функции:

Release 32-bit: последнее выведенное число — 16060
Компилятор использует при вызове данной функции уже 64 байта.

Release 64-bit: последнее выведенное число — 21310
Компилятор использует при вызове данной функции по-прежнему 48 байт.

Для данного примера 64-битному компилятору удалось использовать дополнительные регистры и построить более эффективный код, что позволило сократить количество используемой стековой памяти!

Почему стак именно 64?

Всё просто: для экономии памяти. Тип данных, в котором хранится стак блоков, позволяет хранить число элементов, равное степеням двойки: 1, 2, 4, 8, 16, 32, 64, 128. Оптимальным числом из вышеперечисленных разработчики посчитали 64, и, в принципе, почти всех это устраивает.Apr 3, 2020

Чему равен стак?

Стек (от англ. stack — «стопка»; также распространена неправильная транскрипция «стак») — одна заполненная тем или иным ресурсом ячейка в инвентаре игрока или сундуке. Ёмкость ячейки зависит от ресурса и обычно равна 64 единицам. SMP, мультиплеер (сокращение от англ.

Как взять полный стак вещей в Майнкрафт?

Для того, чтобы переместить стаки однотипных предметов разом (например, 20 стаков булыжника), нужно взять любой стак мышкой, навести курсор на один из перемещаемых стаков, и быстро кликнуть 2 раза ЛКМ с зажатым ⇧ Левый Shift .

Why is a Minecraft stack 64?

Because item counts use 1 byte, which allows a value between 0-255. This was originally the only restriction, it was reduced to 99 just because, then Notch decided this was still too much, and reduced it to 64 just because.

Is there a way to set time to night in Minecraft?

This Minecraft tutorial explains how to set the time to night with screenshots and step-by-step instructions. When the game turns to day in Minecraft, you can change the time back to night with a cheat (game command). Let’s explore how to set the time to nighttime using the /time command.

How to make Minecraft stay day light in creative mode?

Gosh you people are making it complicated as hell just use some night vision potions. It changes it to day (600 ticks). optifine has an option for day only. Location: Somewhere dark and warm. In vanilla, link up a daylight detector to a redstone wire leading 3 blocks, then to an inverter, then to a command block with /time set day in it.

What’s the difference between day and night Minecraft?

We will continue to show them individually for version history. In Minecraft, gameplay is divided into day and night, just like in real life! During the day, you can break blocks and place blocks in new locations to build elaborate structures. And at night, monsters/mobs appear that you can battle.

What is the purpose of creative mode in Minecraft?

Creative mode is one of the main game modes in Minecraft. Creative mode strips away the survival aspects of Minecraft and allows players to easily create and destroy structures and mechanisms with the inclusion of an infinite use of blocks and flying.

What can you do at night in Minecraft?

During the day, you can break blocks and place blocks in new locations to build elaborate structures. And at night, monsters/mobs appear that you can battle. When the game turns to day, you can use a cheat to change the time from day to night.

How to change time of day to night in Minecraft?

Here’s how to change the time of day in Minecraft to night! Steps 1. Open your Minecraft world. Type “time set 13000” or “time set night”. The final command should look like /time set 13000 or /time set night. 4. Hit Enter.

What can you do in creative mode in Minecraft?

Pixel art and other creations made in Creative mode. Creative mode is one of the main game modes in Minecraft. Creative mode strips away the survival aspects of Minecraft and allows players to easily create and destroy structures and mechanisms with the inclusion of an infinite use of blocks and flying.

How do you turn the world back to night in Minecraft?

Typing the command /time set day will activate the daylight sensor, powering the redstone and activating the command block, using the command /time set night to turn it back to night. Make a new world and turn on cheats.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *