Pergunta

Estamos usando c ++ para desenvolver um aplicativo que é executado em Windows CE 4 em um sistema embarcado.

Um dos nossos restrição é que toda a memória usada pelo aplicativo serão atribuídos durante a única inicialização . Nós escrevemos um monte de contentores e algoritmos que estão usando memória somente preallocated vez de alocação de novo.

Você acha que é possível para nós usar as bibliotecas de impulso em vez de nossos próprios recipientes nestas condições?

Quaisquer comentários e / ou conselhos são bem-vindas!

Muito obrigado,

Nic

Foi útil?

Solução

Você pode escrever seu próprio alocador para o recipiente, que aloca de um buffer estático tamanho fixo. Dependendo dos padrões de uso do recipiente o alocador poderia ser tão simples como incrementar um ponteiro (por exemplo, quando você só inserir o material dentro do recipiente uma vez na inicialização do aplicativo, e não continuamente adicionar / elementos Remover.)

Outras dicas

Nós usamos impulso para sistemas embarcados . Com impulso que você pode escolher o que você usa. Nós usamos smart_ptr e boost::bind em todos os nossos projetos. Nós escrever software para celulares baratos . E se o Windows CE pode ser executado em seu hardware eu esperaria que partes do impulso seria aplicável. Há partes do impulso que não têm destinação e você pode encontrá-los úteis.

Eu faria escolher com base em suas necessidades.

Como tudo o que você usa, você precisa saber os custos.

Substituir seus recipientes com recipientes impulso não é uma boa idéia. O trabalho para fazer allocators personalizados apropriadas não seria tão ruim, mas você estaria a violar o espírito do seu 'alocar na inicialização' regra. A ideia subjacente a esta regra (na minha experiência) é geralmente para se certificar de que você não tem que lidar com a sair de situações tipo de memória em tempo de execução. A idéia é ter certeza de que você tem toda a memória que você poderia precisar logo no início, de modo que não há nenhuma possibilidade de qualquer parte do sistema vindo acima do short de memória mais tarde.

Se você usou os recipientes impulso com um alocador de costume, você de repente tem que lidar com a possibilidade de que a piscina do recipiente está alocando a partir poderia ir vazio, eliminando assim a finalidade da regra 'alocar na inicialização'.

Na situação de um dispositivo de memória limitada, gostaria de evitar qualquer tipo de recipiente mais complexo do que uma matriz estaticamente alocado.

Boost é um conjunto de bibliotecas. Alguns deles estão focadas no modelo metaprogramming. Aqueles que não usam mesmo qualquer memória em tempo de execução. Mas a sua pergunta parece ser sobre a substituição de seus recipientes. Eu duvido que é possível, exceto usando alocadores personalizados. Mas, mesmo assim, é mais provável que você estaria usando contêineres STL simples e não impulso. Impulsione só fornece os recipientes TR1, para aqueles compiladores que ainda não incluem TR1.

Não use Boost.

É uma grande biblioteca e seus requisitos básicos de alocação de memória são muito diferentes daqueles dos designers bibliotecas.

Mesmo se você pode obter uma versão atual do impulso ao trabalho de acordo com suas necessidades com alocadores personalizados que podem quebrar com uma nova versão do Boost.

Sinta-se livre para olhar para o código-fonte impulso embora para algumas idéias úteis, mas usar a sua própria aplicação para o que você precisa.

Eu estou olhando para isso agora -. Eu gostaria de usar buffers circulares, recipientes de livre-lock, e assíncrono I / O, e em vez de alocação de memória dinâmica, eu prefiro pools de memória uso

O maior problema que eu vi até agora é que shared_ptr é usado em um monte de lugares, com nenhuma maneira fácil de substituí-lo com intrusive_ptr . Desde aloca shared_ptr memória dinâmica para acompanhar a contagem de referência, não posso usá-lo em um sistema embarcado.

Corrigindo isso parece factível, mas um monte de trabalho - eu tenho para expandir a especificação do modelo de qualquer classe que contém um shared_ptr de modo que o tipo específico de-ponteiro compartilhada pode ser alterado para intrusive_ptr se desejado. Então agora eu tenho que considerar o quanto o trabalho que vai ser, contra a quantidade de trabalho que vai ser para escrever a minha própria versão do impulso características que eu preciso. Não é um lugar agradável para se estar.

Espero pontos alguém por isso que estou errado sobre isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top