специальный режим для free () для удаления?C ++ - PullRequest
0 голосов
/ 14 сентября 2010

Я знаю, это будет звучать странно, но мне нужно, чтобы мое приложение работало быстро, и оно lot обновляет и удаляет. Все функции вызывают new и передают ptr ожидаемый результат для тех, кто нажимает указатель на список или deque.

В конце основного цикла программа перебирает всю эту память и удаляет ее (если я не забыл ее удалить). Я не преувеличиваю. Есть ли режим, который позволяет моему коду выделять объекты для новых, но не удаляет их при удалении, а просто помечает его как неиспользуемый, чтобы следующий новый для этой структуры использовал его вместо полного выделения?

Я полагаю, что это повысит производительность. Это не полностью сделано, так что я не могу сравниться, но я уверен, что я бы увидел повышение, и если бы это было автоматически, то здорово. Есть ли такой режим или флаг, который я могу использовать?

Я использую gcc (linux, win) и MSVC2010 (win).

Ответы [ 5 ]

11 голосов
/ 14 сентября 2010

Попробуйте объединение объектов с помощью Boost - http://www.boost.org/doc/libs/1_44_0/libs/pool/doc/index.html

5 голосов
/ 14 сентября 2010

Что вы подразумеваете под "концом основного цикла" - после того, как цикл завершается, или только до того, как он повторяется?

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

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

«Я полагаю, что это повысит производительность»

К сожалению, мы не можем добиться повышения производительности, просто воображая их ;-p Сначала напишите код, измерьте производительность, а затем беспокойтесь об изменении своего распределения, как только вы поймете, с чем столкнулись. «Быстрее» почти бесполезно, если скучная и простая версия вашего кода уже «достаточно быстра». Обычно вы можете изменить свой механизм выделения без существенных изменений в остальной части вашего кода, так что вам не нужно беспокоиться об этом при предварительном проектировании.

1 голос
/ 14 сентября 2010

То, что вы описываете, это то, что обычно делают malloc и co, сохраняя память и перераспределяя ее для распределений аналогичного размера.

0 голосов
/ 14 сентября 2010

Использование пула памяти - это то, чего вы хотите достичь.

Вы также можете использовать несколько методов выделения кучи Windows, и вместо того, чтобы просто освобождать каждое отдельное распределение, вы можете просто освободить всю кучу сразу.Хотя, если вы используете инструмент профилирования памяти (например, средство проверки границ), он подумает, что это проблема.

0 голосов
/ 14 сентября 2010

Я считаю, что вы ищете "новое размещение".Используйте new, чтобы выделить размер памяти в байтах только один раз.А позже просто используйте ptr следующим образом

Type* ptr = static_cast<Type*>(operator new (sizeof(Type))); // need to call only once and store the pointer
Type* next_ptr = new (ptr) Type();

Вручную вызывайте деструкторы вместо удаления.

next_ptr->~Type();

Поскольку не происходит выделения памяти, это, безусловно, должно быть быстрым.«как быстро» я не уверен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...