В форумах люди часто упоминают, что 64-битные версии программ поглощают больший объем памяти и стека. При этом обычно ссылаются на то, что размеры данных стали в 2 раза больше. Однако это необоснованное утверждение, так как размер большинства типов (char, short, int, float) в языке Си/Си++ остался прежним на 64-битных системах.
Конечно, например, увеличился размер указателей, но ведь не все данные в программе состоят из указателей. Причины роста потребляемой памяти и стека более сложны. Я решил подробнее исследовать данный вопрос.
В данной заметке я поговорю о стеке, а в будущем планирую обсудить выделение памяти и размер двоичного кода. И еще хочу сразу заметить, что статья посвящена языку Си/Си++ и среде разработки Visual Studio.
До недавнего времени я считал, что код 64-битной программы может поглощать стек не быстрее чем в два раза по сравнению с 32-битным кодом. Основываясь на этом предположении, я рекомендовал в статьях на всякий случай увеличивать стек программы в два раза. Однако теперь я выяснил неприятный факт. Поглощение стека может вырасти существенно больше чем в два раза.
КАК БЫСТРО ДОБЫТЬ АЛМАЗЫ В МАЙНКРАФТ | СТАК алмазов за 5 минут
Я был удивлен, поскольку ранее считал рост стека в два раза самым пессимистическим вариантом развития событий. Причина моих необоснованных надежд станет понятна чуть позже. Рассмотрим теперь, как в 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 байт.
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-битному компилятору удалось использовать дополнительные регистры и построить более эффективный код, что позволило сократить количество используемой стековой памяти!
Источник: minecraft-kak.ru
Что такое стак в «Майнкрафт». Моды на стаки
Игроки, что посещают просторы мира «Майнкрафт», пользуются некоторыми терминами, значение которых знают только они. Например «крафт» — это создание предмета. Поэтому многие новички задаются вопросом: «Что такое стак».
Инвентарь персонажа
Канал о подготовке к экзаменам
Прежде чем узнать, что такое стак, нужно сначала разобраться в инвентаре персонажа. В инвентаре можно поместить абсолютно любые предметы, которые персонаж может добыть. Однако место в нем ограничено, поэтому приходится либо экономить, либо строить сундуки, чтобы хранить материалы, которые не нужны на данный момент.
Вам будет интересно: Как в «Майнкрафте» сделать монстра. Руководство по созданию
Также в игре присутствует система автоподъема — то есть, вещи автоматически помещаются в инвентарь, когда персонаж находится рядом с ними.
Для создания сундука понадобятся только деревянные доски в количестве восьми штук. Затем необходимо выложить их по кругу на верстаке и получится один сундук. Можно увеличить вместимость сундука, поставив два хранилища рядом — тогда получается один большой сундук для вещей.
Чтобы переместить сразу весь стак из инвентаря, нужно зажать Shift и кликнуть левой кнопкой мыши.
А вот тем, кто занимается исследованием мира, а не строительством и созданием предметов, придется досконально изучить, что такое стак в «Майнкрафт».
Определение слова
Так что такое стак в «Майнкрафт»? Изучаемый термин или стопка — это ограниченное количество одного типа материала, которое может поместиться в одну ячейку. В «Майнкрафт», что такое стак? Это 64 единицы ресурса, которые можно поместить в один слот инвентаря персонажа.
Когда предел достигнут, то последующее количества материала помещается на соседнюю ячейку, и так далее, пока инвентарь не будет полон. Когда наступит этот момент, игрок не сможет поднять ни одной вещи и они просто будут лежать рядом с тем местом, где ресурс был добыт.
Для того чтобы увеличить место в инвентаре, игроки могут установить мод на стаки, который увеличивает количество помещаемых предметов в одну ячейку. Таким образом можно заниматься добычей или исследованием, не прерываясь на постоянные манипуляции помещения предметов в сундук, или выбрасывания материалов из инвентаря.
Перед скачиванием какого-либо мода на стаки, необходимо убедиться, что игра обновлена до последней версии. Это важно! Для того чтобы мод работал исправно. Следуя инструкции, можно установить модификацию и наслаждаться игрой без ограничений.
Stack Size
Теперь, когда разобрались с тем, что такое стаки, можно установить моды для них. Первая модификация позволяет увеличить количество предметов в одной стопке.
Только есть одно «но» — данный мод увеличивает количество определенных предметов, не не для всех.
Итак, нужно установить мод и закрыть игру. После этого следуем в папку /.minecraft/config и ищем файл Stack Size.cfg. Последние три буквы означают расширение файла, которое позволяет производить настройки конфигурации игровых параметров.
Открываем файл с помощью блокнота и начинаем редактирование. Необходимо отыскать или ввести название того ресурса, количество которого нужно увеличить.
К сожалению, модификация работает только с материалами — для инструментов и оружия он не рассчитан.
Все названия пишутся в два слова и обязательно через нижний пробел. Таким образом можно увеличить количество, например, алмазов с 64 до 164 и так далее.
Stack Up
В отличие от предыдущего мода, этот не ограничен настройками конфигураций. Более того, эта модификация распространяется и на инструменты.
Не нужно прописывать какие-то команды и строки в блокноте и так далее. Достаточно просто найти нужный файл и установить его. Только обязательно нужно удостовериться в том, что версия игры подходит для мода. В противном случае мод просто не будет работать.
Для этого нужно скачать мод и не распаковывать, как это положено обычно. Копируем в папку: C:UsersИмя пользователяAppDataRoaming.minecraftmods.
Теперь можно запускать игру и проверять мод в действии.
Источник: itinru.ru
Почему в стаке 64 предмета?
Канал будет закрыт, но пока я еще пишу свои графоманские заметки.
Предисловие автора: не нужно писать
(а хотя почему не нужно, пишите, это полезно для канала)
Что «это все знают»/»это и так понятно». Да, для понимания вопроса достаточно курса средней школы, но что же делать, если есть те, у кого это знание отсутвует?
И так, начнем с того, что вся информация в компьютере представляет собой «двоичный код» — сочетания двух состояний, обычно обозначаемых на бумаге как 1 и 0. Этот код позже расшифровывается (0 превращается в 1, 1 в 2, 10 в 3 и т.д, если мы говорим про числа). В коде из ограниченного числа символов можно хранить ограниченное число вариантов, например: в код из одного символа может принимать значения от 1 до 2, из 2 -х символов от 1 до 4, из 3 -х от 1 до 8 и т.д., и в бесконечность (это всё варианты, так же могут быть расшифровки с отрицательными числами, от нуля, буквенная расшифровка и как угодно).
Так вот, чем меньше «чисел» в этом сочетании, тем меньше оно «весит», ибо вес это как раз и есть занятые места для состояний. Ограничение в 64 еденицы — 6 «чисел» в сочетании, вероятно было введено»наубум» как «не много и не мало», ибо какой-то стандартной переменной
Приходится вводить теги вручную, проклятый Дзен!
#minecraft #майнкрафт #компьютерные игры #разработка игр #киберспорт
Источник: dzen.ru