почему бы не выделить для него больше памяти?
ulimit -s
) программу?Стек работает быстрее
чем больше стек, тем он медленнее
Это на порядки быстрее кучи.
Куда уж быстрее, чем один такт?
Полтакта? Компьютеры так не работают
Что простите? Ассемблер это просто человекочитаемый машинный код.
Каждая строчка на ассемблере однозначно кодируется машинной командой с точностью до смещений.
Вы так и не объяснили, почему большой стек медленнее маленького?
Какие ваши доказательства?
Один такт это одно переключение транзистора.
Как можно сделать какую-то работу, не переключив ничего?
Например, команда call вызывает процедуру, и транслируется в несколько инструкций (операций). Даже если подобные инструкции однозначны, они дают оверхед.
Не просто большой стек, а большой высоко утилизированный много фрагментированный (короче обычный) стек. Аналогично жёсткому диску, фрагментация замедляет работу.
чем больше стек, тем больше выполняется операций по работе с ним => тратится больше тактов процессора на несвязанные с программой действия => коэффициент утилизации падает.
Микроко́д — программа, реализующая набор инструкций процессора.
хранить большие переменные на стеке неэффективно
О каком оверхеде вы говорите?
Вы о каком стеке говорите то?
Я знаю что такое микрокод.
Куда уж быстрее, чем один такт? Полтакта? Компьютеры так не работают.
Получается, что оверхед по командам составляет минимум 2х, а по времени - минимум 4х.
Поэтому с этой точки зрения микрокод выполняется за дробное количество операций.
Он никак не привязан к тактам
Кстати, регистры - это тоже своего рода физическая абстракция, т.к. для процессора регистры являются такой же памятью, как и l1,l2,l3,ram,ПЗУ
Т.е. когда вы будете в куче выделять память, то оверхеда не будет?
Что бы достать значение из стека не обязательно доставать элементы по очереди.
Ни одна команда или микрокоманда не может быть исполнена менее чем за 1 такт.
Раз это такая же память, то как получить адрес регистра?
Т.е. если бы вы писали на машинном коде, у вас бы программа работала бы быстрее, чем на ассемблере.
Одна команда выполняется за несколько тактов, состоит из нескольких микрокоманд, которые выполняются за 1 такт.
Обязательно. В противном случае, эта абстракция называлась бы по-другому.
Адреса регистров заранее известны
В чем разница?
Число операций для доступа к 'a' в обоих случаях одинакого.
struct stack
{
char *data;
struct stack *next;
};
Просто взгялнув на строчку кода нельзя дать однозначный ответ в какой физический регистр будет осуществен доступ.
struct stack
{
char *data;
struct stack *next;
};
В том, что на машинном коде я могу написать программу без call, без автоматических действий и прочего. Только тот минимум, который необходим. С тем оптимизациями, которые уместны или недоступны верхнему уровню.
выделение и освобождение памяти в стеке это изменение одного регистра, один такт.
Мы с вами говорим об совсем разных сущностях.
Между ними есть биекция.
Да неужели?
Макроассемблер
А когда дело доходит до виртуальных машин, всё становится ещё сложнее.
Речь не идет о макроассемблере.
Почему вы продолжаете мне рассказывать про строение аппаратного стека?