Do ponto de vista lógico (não técnico), não há vantagem.
Qualquer código C / C ++ simples pode ser quebrado dentro da "construção de biblioteca" adequada. Após esse envolvimento, a questão de "se isso é mais vantajoso do que isso" se torna uma questão discutível.
Do ponto de vista da velocidade, o C / C ++ deve permitir que a construção da biblioteca gere um código tão eficiente quanto o código simples que ele envolve. No entanto, isso está sujeito a:
- Função embutida
- Verificação em tempo de compilação e eliminação de verificações desnecessárias em tempo de execução
- Eliminação de código morto
- Muitas outras otimizações de código ...
Usando esse tipo de argumento não técnico, qualquer "função ausente" pode ser adicionada por qualquer pessoa e, portanto, não é contada como desvantagem.
No entanto, requisitos e limitações integrados não podem ser superados com código adicional. Abaixo, argumento que o tamanho de std::bitset
é uma constante em tempo de compilação e, portanto, embora não seja considerado uma desvantagem, ainda é algo que afeta a escolha do usuário.
Do ponto de vista estético (legibilidade, facilidade de manutenção, etc.), há uma diferença.
No entanto, não é aparente que o std::bitset
código conquiste imediatamente o código C simples. É preciso examinar partes maiores do código (e não algumas amostras de brinquedos) para dizer se o uso de std::bitset
melhorou a qualidade humana do código-fonte.
A velocidade da manipulação de bits depende do estilo de codificação. O estilo de codificação afeta a manipulação de bits C / C ++ e é igualmente aplicável std::bitset
também, conforme explicado a seguir.
Se alguém escreve um código que usa operator []
para ler e gravar um bit de cada vez, será necessário fazer isso várias vezes se houver mais de um bit a ser manipulado. O mesmo pode ser dito do código no estilo C.
No entanto, bitset
também tem outros operadores, tais como operator &=
, operator <<=
, etc., que opera sobre a largura total da bitset. Como o maquinário subjacente geralmente pode operar em 32 bits, 64 bits e às vezes 128 bits (com SIMD) por vez (no mesmo número de ciclos de CPU), código projetado para tirar proveito de tais operações de vários bits pode ser mais rápido que o código de manipulação de bits "em loop".
A idéia geral é chamada SWAR (SIMD dentro de um registro) e é um subtópico sob manipulações de bits.
Alguns fornecedores de C ++ podem implementar bitset
entre 64 bits e 128 bits com o SIMD. Alguns fornecedores podem não o fazer (mas eventualmente o fazem). Se for necessário saber o que a biblioteca do fornecedor C ++ está fazendo, a única maneira é observar a desmontagem.
Quanto a std::bitset
ter limitações, posso dar dois exemplos.
- O tamanho de
std::bitset
deve ser conhecido em tempo de compilação. Para criar uma matriz de bits com tamanho escolhido dinamicamente, será necessário usar std::vector<bool>
.
- A especificação atual do C ++ para
std::bitset
não fornece uma maneira de extrair uma fatia consecutiva de N bits de um bitset
M maior de bits.
O primeiro é fundamental, o que significa que, para as pessoas que precisam de conjuntos de bits de tamanho dinâmico, precisam escolher outras opções.
O segundo pode ser superado, porque é possível escrever algum tipo de adaptador para executar a tarefa, mesmo que o padrão bitset
não seja extensível.
Existem certos tipos de operações avançadas do SWAR que não são fornecidas de imediato std::bitset
. Pode-se ler sobre essas operações neste site sobre permutações de bits . Como de costume, é possível implementá-las por conta própria, operando em cima std::bitset
.
Em relação à discussão sobre desempenho.
Uma advertência: muitas pessoas perguntam por que (algo) da biblioteca padrão é muito mais lento do que um código simples no estilo C. Não repetiria aqui o pré-requisito do microbenchmarking, mas tenho apenas este conselho: verifique o benchmark no "modo de liberação" (com otimizações ativadas) e verifique se o código não está sendo eliminado (eliminação do código morto) ou está sendo içada em um loop (movimento de código invariante em loop) .
Como, em geral, não podemos dizer se alguém (na Internet) estava fazendo as marcas de microbench corretamente, a única maneira de obter uma conclusão confiável é fazer nossas próprias marcas de microbench, documentar os detalhes e enviar para revisão e crítica públicas. Não faz mal refazer as marcas de micropigmentação que outras pessoas fizeram antes.
std::bitset
é fixado em tempo de compilação. Essa é a única desvantagem incapacitante em que consigo pensar.