В Windows асинхронные операции сделаны операцией файла, не дескриптором. Существует несколько способов ожидать на операциях файла для завершения асинхронно.
, Например, если Вы хотите знать, когда данные доступны на сетевом сокете, выпустите асинхронный запрос чтения на сокете и когда это завершается, данные были доступны и были получены.
В Win32, асинхронные операции используют OVERLAPPED
структура для содержания состояния о выдающейся операции IO.
WaitForMultipleObjects
для ожидания на всех событиях сразу. Это имеет недостаток только способности ожидать на MAXIMUM_WAIT_OBJECTS
объекты сразу (64). Можно также ожидать на других типах событий одновременно (завершение процесса/потока, взаимные исключения, события, семафоры) ReadFileEx
и WriteFileEx
для организации очередей Асинхронные Вызовы процедуры (APCs) к вызывающему потоку и SleepEx
(или WaitFor{Single|Multiple}ObjectsEx
) с Alertable TRUE
для получения уведомления для каждой операции, когда это завершается. Этот метод подобен порту завершения IO, но только работает на один поток. ядро Windows NT не делает различия между сокетом, дисковым файлом, каналом, и т.д. операции файла внутренне: все эти опции будут работать со всеми типами файлов.
Стандарт C ++ 23.2.4.2 только говорит, что vector :: capacity
равно
Общее количество элементов, которые вектор может содержать без необходимости перераспределения.
Это означает, что фактическое значение полностью зависит от реализации.
Емкость может быть любой, которую разработчики считают правильной или необходимой.
Следует также отметить, что никогда не «безопасно» предполагать, что вы знаете текущую емкость ()
без вызова этой функции. Если вы зарезервируете 10 элементов, разработчик может выделить сто, если захочет. Или 11, 42 (предпочтительно) или просто 10.
Я думаю, вы немного не понимаете объем этого проекта, по крайней мере, в отношении названия.
Эмулятор выполняет двоичный код, и ничего больше. Эмулятор не включает ни редактор (это инструмент разработки), ни ассемблер (то же самое). Это ассемблер ' s ответственность за проверку и перевод синтаксиса, таким образом, эмулятор выполняет только относительно простую работу по выполнению предварительно проверенного, юридического кода.
Похоже, вы хотите создать полную IDE. Это обернуло бы много графического интерфейса вокруг редактора, ассемблера и эмулятора. Я бы оставил этот шаг последним.
Что касается ваших вопросов относительно самого эмулятора:
Вы можете использовать массив до (например) 64 Кбайт в качестве рабочей памяти эмулятора. Вы используете в своей программе переменные для имитации регистров. Я бы использовал unsigned char *
для эмуляции счетчика программ и int
s для большинства других вещей ...
Операция довольно проста: запустите счетчик программы с 0 (или заранее определенное место загрузки) и запустить цикл, который извлекает инструкции через этот указатель, и применить к регистрам и памяти любую операцию, связанную с инструкцией. Простая реализация будет сосредоточена вокруг огромного оператора switch
, который включает все возможные коды инструкций.
Как я уже сказал, вашему эмулятору не нужно беспокоиться о недопустимых инструкциях, потому что ассемблер не должен создавать никаких . Вы можете остановить свою программу (т.е. основной цикл), если она обнаружит недопустимую операцию.
Точно так же вашему эмулятору не нужно беспокоиться о превышении диапазона, индекса или размера ... это тоже проблема ассемблера или, может быть, компоновщик, если он у вас есть.
Обновление: Несколько указателей прямо здесь, в SO:
Для быстрого сканирования Google и отскока от нескольких случайных форумов (обычно неизвестной родословной, так что да), это, похоже, зависит от конкретной реализации.
Практически не проблема. так как вы можете сразу изменить его, позвонив в резерв
.