C++ · Avançado · Inglês · Técnico
empty base optimization
Otimização que faz a base vazia não ocupar espaço no objeto derivado, ao contrário de um membro vazio, que ocupa ao menos um byte. Permite policies sem custo de memória.
Onde usar
Usada por bibliotecas como std::unique_ptr com deletor sem estado, para que o ponteiro não fique maior que um ponteiro cru. Desde o C++20, [[no_unique_address]] dá o mesmo efeito para membros.
Em código
struct Vazio {};
struct Membro { Vazio v; int x; };
struct Base : Vazio { int x; };
struct Attr {
[[no_unique_address]] Vazio v;
int x;
};
// sizeof: 8, 4, 4 (típico)Exemplos
The empty base optimization keeps the pointer eight bytes.
A empty base optimization mantém o ponteiro com oito bytes.
Use no_unique_address so the empty member takes no space.
Use no_unique_address para o membro vazio não ocupar espaço.
Cuidado
Não vale quando a base vazia é do mesmo tipo de outro subobjeto, pois dois objetos distintos do mesmo tipo não podem ter o mesmo endereço.
Sinônimos
EBO