Использование повышения во встроенной системе с ограничением памяти - PullRequest
9 голосов
/ 03 октября 2008

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

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

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

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

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

Nic

Ответы [ 6 ]

13 голосов
/ 04 октября 2008

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

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

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

6 голосов
/ 03 октября 2008

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

2 голосов
/ 06 января 2009

Замена ваших контейнеров на контейнеры Boost НЕ является хорошей идеей. Работа по созданию соответствующих пользовательских распределителей не будет такой уж плохой, но вы нарушите дух вашего правила «распределять при запуске». Идея, лежащая в основе этого правила (по моему опыту), как правило, состоит в том, чтобы вам не приходилось сталкиваться с ситуациями нехватки памяти во время выполнения. Идея состоит в том, чтобы убедиться, что у вас есть вся память, которая может понадобиться ПРАВИЛЬНО НА ПУСКЕ, чтобы не было возможности для какой-либо части системы в будущем испытать недостаток памяти.

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

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

1 голос
/ 03 октября 2008

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

0 голосов
/ 15 июня 2017

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

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

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

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

0 голосов
/ 03 октября 2008

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

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

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

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

...