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).

questionAnswers(1)

yourAnswerToTheQuestion