O que é uma classe “quase vazio”?
Pergunta
Compilar a seguinte classe
class Interface
{
virtual void doIt() = 0;
virtual ~Interface() = 0;
};
inline Interface::~Interface() {}
usando gcc -fdump-class-hierarchy
.
gcc
emite
Class Interface size=4 align=4 base size=4 base align=4 Interface (0x1a779c0) 0 nearly-empty vptr=((& Interface::_ZTV9Interface) + 8u)
Qual é o significado de "quase vazio"? O que significa?
Solução
O C ++ ABI fornece uma definição de "quase vazio" classes e uma interessante discussão sobre como eles afetam a construção vtable:
Uma classe que contém um apontador virtual, mas há outros dados, excepto (possivelmente) bases virtuais. Em particular, ele:
- não tem outros que zero-width bitfields,
membros de dados não-estáticos- não tem classes base diretas que não são ou vazio, quase vazio, ou virtual,
- tem, no máximo, classe base directa quase vazia um não-virtual, e
- não tem classe base adequada que está vazio, não é moralmente virtual, e em um deslocamento diferente de zero.
Eu corri em toda esta enquanto pesquisava o efeito de bases virtuais quase vazias no tamanho do objeto, tamanho vtable e sobrecarga de chamada virtual.
Outras dicas
Acho que é para diferenciá-lo de "esvaziar", que é o que você ganha se compilar uma classe sem membros em tudo. "Quase vazio" parece significar que Hasa VTable e nada mais.
C ++ tem algo chamado de "otimização de base vazia". Se uma classe não possui membros, não precisa ocupar espaço quando ele é usado como uma classe base. Um exemplo de por que isso é importante é std::unary_function<T, U>
. Ela existe para lhe fornecer um conjunto fácil de typedefs. Esses typedefs não deve contribuir para o tamanho de sua classe functor.
Se você tem uma classe base com um ponteiro vtable, este ponteiro pode provavelmente ser compartilhadas com a classe derivada. Você simplesmente criar uma vtable para a classe derivada que adiciona seus próprios métodos após o da classe base.
Você pode agora alcançar um similar "nenhuma sobrecarga extra" classe base. Aparentemente chamadas GCC que "quase vazio".
Ele só tem uma vtable, há campos de dados.