Вопрос

Я пытаюсь выяснить, может ли конструктор boost::multi_array или метод изменения размера выдать исключение bad_alloc (или какое-либо другое исключение, указывающее, что выделение или изменение размера не удалось).Нигде не могу найти эту информацию в документации.

Уточнение (добавлено из комментария):

Это научный алгоритм, который может вернуться к менее интенсивному использованию памяти (более медленному) методу, если выделение не удастся.По сути, существуют два динамически выделяемых трехмерных массива для хранения «расстояний» (корреляции) между всеми парами генов в запросе и всеми генами в наборе перекрестной проверки для каждого из большого количества наборов данных.Более медленный метод пересчитывает каждое расстояние на лету по мере необходимости.Это версия C++ существующей реализации Java, в которой реализованы оба метода и которая может использовать исключение нехватки памяти.Я действительно не ожидаю, что у меня закончится память.

Это было полезно?

Решение

1-й: (отвечая на реальный вопрос):Поскольку он использует динамически выделяемую память, да, он может выдавать std::bad_alloc (Я никогда не видел перевода Boost std::bad_alloc исключения;было бы безумием так поступать).

2-й: (комментарий к вашему уточнению):Вам нужна информация о доступной физической памяти, чтобы оптимизировать производительность вашего алгоритма во время выполнения.Однако вы не можете полагаться на std::bad_alloc чтобы определить, сколько памяти у вас доступно, поскольку современные операционные системы используют такую ​​вещь, как перегружать, значение:они (почти) никогда не возвращают неудачную попытку выделения, а вместо этого просто дают вам некоторую «память», которая не сможет появиться только тогда, когда вы действительно попытаетесь получить к ней доступ.

В Java это может сработать, поскольку виртуальная машина делает за вас многое:он пытается выделить несколько непрерывных фрагментов памяти и делает это в отношении доступной физической памяти и доступной памяти. неиспользованный физической памяти, чтобы решить, следует ли ей больше нагружать сборщик мусора или просто выделять больший мусор.Кроме того, по соображениям производительности необходимо учитывать, что виртуальная память и физическая память — это совершенно разные понятия.

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

Другие советы

Отсутствие явной спецификации исключения является преднамеренным. Видеть это Подраздел для объяснения. Кроме того, обратите внимание, что отсутствие явной спецификации означает, что нет никаких ограничений на тип исключения, который может бросить функция. Таким образом, по крайней мере, CTOR и функция изменения размера могут бросить исключения в случае, если память исчерпана или если копия-объект-объект не выполняется.

Некоторые общие ссылки, которые вдохновляют импульс, которые вас могут заинтересовать:

Почему бы не проверить это? Легко передать абсурдно высокое значение, чтобы генерировать исключение.

С другой стороны, что вы планируете сделать, если генерирует это исключение? std::bad_alloc это тот вид исключения, с которым вы обычно не можете иметь дело на микроуровне ...

Например, на веб -сервере вы обычно выполняете некоторую очистку (откат на транзакции DB?), А затем вернете 500 ошибка пользователю.

Но когда память исчерпана, вы не можете сделать безопасно, так как вам придется осторожно идти, если вы не хотите снова нажимать на стену памяти, которая, как вы знаете, близко :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top