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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top