2017-01-04 3 views
5

Мне интересно, используют ли стандартные алгоритмы сортировки библиотек (например, std :: sort) кучную память для сортировки.std :: использование памяти алгоритмов сортировки

Есть ли какой-либо надежный источник, как узнать, какой тип (куча, стек) и сколько временной памяти используется алгоритмом сортировки или любым стандартным библиотечным алгоритмом в целом?

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

Спасибо заранее!

+3

Я не знаю, есть ли какие-либо общие ответы или «гарантии». Но если проблема имеет решающее значение, тогда общий ответ, вероятно, недостаточно хорош. Вам нужен ответ для конкретной реализации для std :: sort и такой на платформе, которую вы используете. Возможно, вам повезло, так как многие вещи std (особенно все шаблоны) полностью реализованы в заголовках C++. В этом случае на самом деле нет ничего, что мешало бы вам взглянуть на реализацию самостоятельно, чтобы проверить все, что вас беспокоит. – TheUndeadFish

+0

Только что просмотрел недавний стандартный черновик. Я не вижу ничего, заявляя, что 'sort' не может использовать кучу, просто требования о том, как поддерживается' swap'. Копаясь через 'swap', снова нет подробностей о том, используется ли куча для хранения временных рядов во время обмена. – user4581301

+0

@ user4581301 Стандарт даже не имеет понятия «куча» и «стопка» для начала, поэтому любая гарантия относительно «где» выделена память, будет довольно удивительной. –

ответ

7

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

Вы можете проверить, не соответствует ли какая-либо конкретная реализация, но, в общем, вы не можете контролировать, как реализация реализует свои алгоритмы.


Однако:

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

Реализация должна убедиться, что его алгоритмы делают то, что они должны делать, как это определено стандартами. Это означает: если у вас есть компилятор C++, который поддерживает вашу целевую среду, он должен поступать правильно на указанной целевой платформе, однако это достигает этого.

В частности: Если ваша платформа не имеет кучи, любая реализация, которая ее поддерживает, не должна использовать кучу.

+0

'std :: sort' * не может * на практике использовать кучу, потому что она * может не * бросать' bad_alloc', насколько я знаю? (если только ваш код не делает) (И да, патологически он мог бы, с бессмысленным распределением кучи, а затем поймать, который игнорирует ошибку) – Yakk

+0

В случае std :: sort обычно исходный код в < algorithm > можно просмотреть с помощью редактора видеть то, что он делает. В случае с Visual Studio std :: sort использует комбинацию быстрой сортировки, сортировки кучи (используется для предотвращения сложной временной сортировки O (n^2) быстрой сортировки) и сортировки вставки, причем все они находятся на месте сортировки , поэтому нет явного выделения памяти из кучи. std :: stable_sort() - это вариация сортировки слияния и выделяет временный буфер (1/2 размер исходного массива). VS-реализация быстрой сортировки ограничивает сложность стекового пространства до O (log2 (n)). – rcgldr

+0

@Yakk Стандартная реализация библиотеки может использовать некоторое нераспространяющееся распределение, я полагаю, и прекращение работы ОС не является исключением в стандартном смысле. Тем не менее, я считаю, что это подпадает под вторую часть моего ответа: 'std :: sort' должен сортировать, а не бросать, * как * это делает это не касающимся нас пользователей. –

Смежные вопросы