Использование boost во встроенной системе с ограничением памяти

StackOverflow https://stackoverflow.com/questions/166542

Вопрос

Мы используем c ++ для разработки приложения, которое работает под управлением Windows CE 4 во встроенной системе.

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

Как вы думаете, возможно ли для нас использовать библиотеки boost вместо наших собственных контейнеров в этих условиях?

Любые комментарии и / или советы приветствуются!

Большое спасибо,

Сетевой адаптер

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

Решение

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

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

Мы используем boost для встраиваемых систем.С помощью boost вы можете выбирай сам то, что вы используете.Мы используем smart_ptr и boost::bind во всех наших проектах.Мы пишем программное обеспечение для дешевые сотовые телефоны.И если Windows CE может работать на вашем оборудовании, я бы ожидал, что части наддува было бы применимо.Есть части boost, которые не имеют выделения, и вы можете счесть их полезными.

Я бы так и сделал выбирай сам в зависимости от ваших требований.

Как и все, чем вы пользуетесь, вам нужно знать стоимость.

Замена ваших контейнеров контейнерами Boost - НЕ очень хорошая идея.Работа по созданию соответствующих пользовательских распределителей была бы не такой уж плохой, но вы бы нарушили дух вашего правила "выделять при запуске".Идея, лежащая в основе этого правила (по моему опыту), как правило, заключается в том, чтобы убедиться, что вам не придется иметь дело с ситуациями нехватки памяти во время выполнения.Идея состоит в том, чтобы убедиться, что у вас есть вся память, которая вам может понадобиться с самого НАЧАЛА, чтобы впоследствии не было возможности, что какой-либо части системы не хватит памяти.

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

В ситуации с ограниченным объемом памяти устройства я бы избегал любого типа контейнера, более сложного, чем статически выделенный массив.

Boost - это набор библиотек.Некоторые из них сосредоточены на шаблонном метапрограммировании.Они даже не используют никакой памяти во время выполнения.Но ваш вопрос, похоже, касается замены ваших контейнеров.Я бы сомневался, что это возможно, за исключением использования пользовательских распределителей.Но даже в этом случае, скорее всего, вы бы использовали обычные контейнеры STL, а не boost.Boost предоставляет только контейнеры TR1 для тех компиляторов, которые еще не включают TR1.

Не используйте Boost.

Это большая библиотека, и ваши базовые требования к выделению памяти сильно отличаются от требований разработчиков библиотек.

Даже если вы сможете заставить текущую версию Boost работать в соответствии с вашими требованиями с пользовательскими распределителями, она может прерваться с новой версией Boost.

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

Я изучаю это прямо сейчас — я хотел бы использовать циклические буферы, контейнеры без блокировки и асинхронный ввод-вывод, и вместо выделения динамической памяти я бы предпочел использовать пулы памяти.

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

Исправление этого выглядит выполнимым, но требует много работы — я должен расширить спецификацию шаблона любого класса, который содержит shared_ptr так что конкретный тип общего указателя может быть изменен на intrusive_ptr при желании.Так что теперь я должен рассмотреть, сколько это будет стоить работы по сравнению с тем, сколько труда потребуется для написания моей собственной версии необходимых мне функций Boost.Не самое приятное место для пребывания.

Я надеюсь, что кто-нибудь укажет, почему я ошибаюсь в этом.

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