Como o std :: align_storage pode expor o armazenamento alinhado corretamente para qualquer objeto?
ostd::aligned_storage
estrutura fornece umatype
typedef que pelo menos de acordo comcppreference:
Fornece o tipo de membro typedef, que é um PODType adequado para uso como armazenamento não inicializado para qualquer objeto cujo tamanho seja no máximo Len e cujo requisito de alinhamento seja um divisor de Alinhar.
O valor padrão de Alinhar é o requisito de alinhamento mais rigoroso (o maior) para qualquer objeto cujo tamanho seja no máximo Len.
Em particular, com o valor padrão deAlign
, o alinhado adequadamente paraqualquer objeto cujo tamanho é no máximo Len.
Observe que não há advertências ou exceções para tipos superalinhados (e, de qualquer forma, a plataforma que estou usando, gcc, suporta pelo menos alguns tipos superalinhados).
Como essa implementação realmente funciona? Para satisfazer o requisito de "qualquer objeto", parece que:
Em uma plataforma ondealignof(T) <= sizeof(T)
para tiposT
, sempre precisa alinhar aproximadamenteLen
bytes, já que um objeto de tamanhoLen
poderia ter um alinhamento de atéLen
. Obviamente, isso desperdiçaria muita memória para grandesLen
!Em uma plataforma ondealignof(T)
pode ser maior quesizeof(T)
, Não vejo como isso poderia ser implementado. No entanto, não éclaro para mim que esse tipo pode até existir.Baseado emmeus testes, por padrãoAlign
valores,gcc
simplesmente alinha-se sempre a 16, independentemente de len. Isso significa que o armazenamento énão adequado paraqualquer objeto, mas apenas objetos de alinhamento fundamental (alignof(max_align_t) == 16
nesta plataforma).