Я бы сказал, что причина, по которой pop () не выдает исключение, не имеет ничего общего с эффективностью или производительностью, но с - исключениями.
Как утверждается в другом месте :
Объяснение SGI: http://www.sgi.com/tech/stl/stack.html
Можно задаться вопросом, почему возвращается pop ()
void, вместо value_type. То есть,
почему нужно использовать top () и pop () для
осмотрите и удалите верхний элемент,
вместо того, чтобы объединить два в
функция одного члена? На самом деле, там
хорошая причина для этого дизайна. Если
pop () вернул верхний элемент, это
придется вернуть по стоимости, а
чем по ссылке: возврат по ссылке
создаст висячий указатель.
Возврат по значению, однако,
неэффективно: включает в себя по крайней мере один
вызов конструктора избыточной копии. поскольку
для pop () невозможно вернуть
значение таким образом, чтобы быть как
эффективнее и правильнее, больше
разумно для него не возвращать значение в
все и требовать от клиентов использования
top () для проверки значения сверху
стека.
std :: stack является шаблоном. Если pop () вернул верхний элемент, он
придется вернуть по стоимости, а
чем по ссылке в соответствии с вышеизложенным
объяснение. Это означает, что у звонящего
сторона должна быть скопирована в другой T
тип объекта. Это включает в себя копию
конструктор или копия задания
вызов оператора. Что если этот тип T
достаточно сложный, и это бросает
исключение при копировании или
копировать назначение? В этом случае
значение, то есть вершина стека (возвращается
по значению) просто теряется и есть
нет другого способа получить его из
стек как операция стека поп
успешно завершено!
Как только мы пришли к выводу, что pop должен не возвращать элемент, который всплывает, и, следовательно, его интерфейс фиксируется как void pop()
, он - это мое мнение - больше не имеет никакого смысла предписывать, что происходит когда pop () вызывается для пустого стека.
Обратите внимание, что стандарт требует !empty()
в качестве предварительного условия для вызова pop ().
UncleBens (в комментариях), безусловно, имеет точку зрения, что отсутствие проверки предварительных условий во время выполнения (что никогда не предписывается стандартом C ++ AFAIK) имеет определенный запах производительности. Однако, процитирую часть оригинального вопроса: (выделение мое)
(я разрабатываю специализированный стек для
мой собственный код и хотел бы знать
компромиссы с этим подходом (который
требует, чтобы один вручную проверить, если
стек пуст ) против броска
исключение.
Я буду утверждать, что тот факт, что pop()
ничего не возвращает, делает вопрос спорным. Это (IMHO) просто не имеет смысла заставлять pop () проверять, пустой ли стек, когда мы действительно ничего не получаем от него (то есть, если бы стек был пустым, pop () может быть просто noop , что (по общему признанию) также не предписано Std).
Я думаю, что можно спросить, почему top()
не вызывает исключение , или , можно спросить, почему pop()
не возвращает верхний элемент. Если pop
ничего не возвращает, создание исключения не имеет смысла (в мире C ++) - утверждение о том, что оно не генерирует исключение «из-за затрат на исключение во время выполнения», как, по-видимому, подразумевают другие ответы это - ИМХО - упущение.