Как управлять большим буфером в C ++? - PullRequest
4 голосов
/ 31 июля 2009

Если мне нужен большой буфер в моей программе, написанной на C ++, какой из них лучше?

  1. Выделите буфер в куче и сохраните ссылку на этот буфер в классе которые используют это.

  2. Выделите статический буфер и сделайте его глобальным.

Ответы [ 5 ]

14 голосов
/ 31 июля 2009

Как насчет: 3. Использовать вектор.

[Отредактировано для добавления: или boost :: array - хороший вариант, если вы довольны зависимостью]

2 голосов
/ 31 июля 2009

Я предпочитаю выделение кучи по многим причинам -

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

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

2 голосов
/ 31 июля 2009

Недостаток статического буфера в том, что вы никогда точно не знаете, когда он будет удален, если вы хотите использовать этот буфер во время уничтожения какого-либо объекта, он уже может быть удален. Поэтому для большего контроля я бы выбрал вариант 1.

1 голос
/ 31 июля 2009

При работе с большими объемами памяти вы должны смотреть на две вещи, жизненный цикл, как часто вы создаете и воссоздаете этот буфер. Поскольку память фрагментируется, может наступить момент, когда вы попытаетесь выделить буфер, скажем, 512 МБ, а вы не сможете, потому что ваш распределитель не может найти 512 МБ непрерывного адресного пространства. Вот почему идея @ onebyone об использовании векторов иногда лучше. Если вы сможете сократить объем занимаемой памяти до кусочков (не в буквальном смысле), вы получите гибкость в управлении своей памятью.

Тем не менее, я почти НИКОГДА не рекомендую хранить большой статический буфер. Это напрашивается на неприятности.

1 голос
/ 31 июля 2009

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

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

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