boost :: multi_array изменить размер исключения? - PullRequest
3 голосов
/ 22 марта 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 22 марта 2010

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

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

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

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

0 голосов
/ 22 марта 2010

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

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

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

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

0 голосов
/ 22 марта 2010

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

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

...