Различие между прерыванием и событием

compressed_pair использование некоторый шаблонный обман для оставления свободного места. В C++ объект (маленький o) не может иметь того же адреса как другой объект.

Поэтому, даже если Вы имеете

struct A { };

A, размер не будет 0, потому что затем:

A a1;
A a2;
&a1 == &a2;

содержал бы, который не позволяется.

, Но много компиляторов сделают то, что называют "пустой оптимизацией базового класса":

struct A { };
struct B { int x; };
struct C : public A { int x; };

Здесь, для B и C хорошо иметь тот же размер, даже если sizeof(A) не может быть нуль.

Так boost::compressed_pair использует в своих интересах эту оптимизацию и, если это возможно, наследуется от одной или других из типов в паре, если это пусто.

Так std::pair мог бы быть похожим (я игнорировал много, ctors и т.д.):

template<typename FirstType, typename SecondType>
struct pair {
   FirstType first;
   SecondType second;
};

, Который означает, ли или FirstType или SecondType A, Ваш pair<A, int>, должно быть больше, чем [1 116].

, Но если Вы используете compressed_pair, его сгенерированный код будет выглядеть сродни:

 struct compressed_pair<A,int> : private A {
    int second_;
    A first() { return *this; }
    int second() { return second_; }
 };

И compressed_pair<A,int> только будет целый sizeof (интервал).

18
задан Ian Vaughan 3 March 2011 в 11:28
поделиться

2 ответа

Обе эти две концепции предлагают способы для «системы / программы» работать с различными «условиями», которые имеют место во время нормального развертывания некоторой программы и для которых может потребоваться «система / программа» "сделать что-то еще, прежде чем вернуться (или нет ...) к исходной задаче. Однако , помимо этого функционального сходства, они представляют собой очень разные концепции, используемые в разных контекстах, на разных уровнях .

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

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

Очень известным прерыванием является INT 0x21, программа вызывает [d] для вызова служб из MS-DOS.

Прерывания обычно отправляются посредством векторных таблиц, при этом ЦП имеет определенное место в памяти, содержащее массив адресов [где находятся определенные обработчики прерываний]. Изменяя содержимое таблицы прерываний [если это разрешено ...], программа может переопределить, какой конкретный обработчик будет вызываться для данного номера прерывания.

События , с другой стороны, являются «сообщениями» системного / языкового уровня, которые могут использоваться для обозначения различные аппаратные или программные ситуации (я бы использовал слово «событие»), такие как щелчки мыши, ввод с клавиатуры, а также ситуации на уровне приложений, такие как «Новая запись вставлена ​​в базу данных» или хорошо усвоенные запросы и сообщения, используемые в модульных программах для связь / запросы между различными частями программы.

В отличие от прерываний с их [относительно простым] поведением, которое полностью определяется процессором, существуют различные системы систем событий на уровне операционной системы, а также различные структуры ( например: MS Windows, JavaScript, .NET, графические интерфейсы, такие как QT и т. д.). Все системы мероприятий, хотя и различаются по своим реализациям, обычно имеют общие свойства, такие как

  • концепция обработчика, который представляет собой конкретную функцию / метод программы, которая предназначена для обработки определенных типов событий из определенных источников событий.
  • концепция события, которое представляет собой [обычно небольшую] структуру, содержащую информацию о событии: его тип, его источник, настраиваемые параметры (семантика которых зависит от типа события)
  • очередь, в которую события вставляются источниками и опрашиваются потребителями / handlers (или, точнее, диспетчерами, в зависимости от системы ...)
32
ответ дан 30 November 2019 в 07:44
поделиться

Прерывания реализованы внутри аппаратного обеспечения (ЦП) для прерывания обычно линейного потока программы. Это важно для внешних событий, таких как ввод с клавиатуры, но также и для прерывания программ в многозадачных операционных системах.

События являются средством разработки программного обеспечения и, вероятно, наиболее часто известны из инструментальных средств графического интерфейса. Там инструментарий / ОС превращает такие события, как нажатия клавиш или ввод мыши, в «события». Затем они отправляются в программы, которые зарегистрировались для получения таких событий. Возможно, это немного похоже на почтовую систему.

Для сравнения, с точки зрения программы в пространстве пользователя:

-Interrupts заставили бы вашу программу останавливаться, чтобы позволить выполнить некоторый код более низкого уровня (например, код ОС)

-События обычно отправляются вам из кода нижнего уровня и запускают выполнение вашего кода

1
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

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