какова способность пустого вектора?

В Windows асинхронные операции сделаны операцией файла, не дескриптором. Существует несколько способов ожидать на операциях файла для завершения асинхронно.

, Например, если Вы хотите знать, когда данные доступны на сетевом сокете, выпустите асинхронный запрос чтения на сокете и когда это завершается, данные были доступны и были получены.

В Win32, асинхронные операции используют OVERLAPPED структура для содержания состояния о выдающейся операции IO.

  1. Партнер файлы с Порт Завершения IO и диспетчеризируют асинхронные запросы IO. Когда операция завершится, она поместит сообщение завершения на очередь, на которой Ваш рабочий поток (потоки) может ожидать и получить, когда они прибывают. Можно также поместить определяемые пользователем сообщения в очередь. Нет никакого предела тому, сколько файлов или сообщений с очередями может использоваться с портом завершения
  2. Отправка каждая операция IO с событием. Событие, связанное с операцией, станет сообщенным (удовлетворите ожидание), когда оно завершается. Используйте WaitForMultipleObjects для ожидания на всех событиях сразу. Это имеет недостаток только способности ожидать на MAXIMUM_WAIT_OBJECTS объекты сразу (64). Можно также ожидать на других типах событий одновременно (завершение процесса/потока, взаимные исключения, события, семафоры)
  3. Использование пул потоков . Пул потоков может взять неограниченное количество объектов и операций файла, чтобы ожидать на и выполниться определяемая пользователем функция после завершения каждый.
  4. Использование ReadFileEx и WriteFileEx для организации очередей Асинхронные Вызовы процедуры (APCs) к вызывающему потоку и SleepEx (или WaitFor{Single|Multiple}ObjectsEx) с Alertable TRUE для получения уведомления для каждой операции, когда это завершается. Этот метод подобен порту завершения IO, но только работает на один поток.

ядро Windows NT не делает различия между сокетом, дисковым файлом, каналом, и т.д. операции файла внутренне: все эти опции будут работать со всеми типами файлов.

5
задан Community 23 May 2017 в 11:45
поделиться

4 ответа

Стандарт C ++ 23.2.4.2 только говорит, что vector :: capacity равно

Общее количество элементов, которые вектор может содержать без необходимости перераспределения.

Это означает, что фактическое значение полностью зависит от реализации.

16
ответ дан 18 December 2019 в 07:09
поделиться

Емкость может быть любой, которую разработчики считают правильной или необходимой.

Следует также отметить, что никогда не «безопасно» предполагать, что вы знаете текущую емкость () без вызова этой функции. Если вы зарезервируете 10 элементов, разработчик может выделить сто, если захочет. Или 11, 42 (предпочтительно) или просто 10.

7
ответ дан 18 December 2019 в 07:09
поделиться

Я думаю, вы немного не понимаете объем этого проекта, по крайней мере, в отношении названия.

Эмулятор выполняет двоичный код, и ничего больше. Эмулятор не включает ни редактор (это инструмент разработки), ни ассемблер (то же самое). Это ассемблер ' s ответственность за проверку и перевод синтаксиса, таким образом, эмулятор выполняет только относительно простую работу по выполнению предварительно проверенного, юридического кода.

Похоже, вы хотите создать полную IDE. Это обернуло бы много графического интерфейса вокруг редактора, ассемблера и эмулятора. Я бы оставил этот шаг последним.


Что касается ваших вопросов относительно самого эмулятора:

Вы можете использовать массив до (например) 64 Кбайт в качестве рабочей памяти эмулятора. Вы используете в своей программе переменные для имитации регистров. Я бы использовал unsigned char * для эмуляции счетчика программ и int s для большинства других вещей ...

Операция довольно проста: запустите счетчик программы с 0 (или заранее определенное место загрузки) и запустить цикл, который извлекает инструкции через этот указатель, и применить к регистрам и памяти любую операцию, связанную с инструкцией. Простая реализация будет сосредоточена вокруг огромного оператора switch , который включает все возможные коды инструкций.

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

Точно так же вашему эмулятору не нужно беспокоиться о превышении диапазона, индекса или размера ... это тоже проблема ассемблера или, может быть, компоновщик, если он у вас есть.


Обновление: Несколько указателей прямо здесь, в SO:

-1
ответ дан 18 December 2019 в 07:09
поделиться

Для быстрого сканирования Google и отскока от нескольких случайных форумов (обычно неизвестной родословной, так что да), это, похоже, зависит от конкретной реализации.

Практически не проблема. так как вы можете сразу изменить его, позвонив в резерв .

0
ответ дан 18 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

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