问题
Compile the following class
class Interface
{
virtual void doIt() = 0;
virtual ~Interface() = 0;
};
inline Interface::~Interface() {}
using gcc -fdump-class-hierarchy
.
gcc
emits
Class Interface size=4 align=4 base size=4 base align=4 Interface (0x1a779c0) 0 nearly-empty vptr=((& Interface::_ZTV9Interface) + 8u)
What is the significance of "nearly-empty"? What does it mean?
回答1:
The C++ ABI provides a definition of "nearly empty" classes and an interesting discussion of how they affect vtable construction:
A class that contains a virtual pointer, but no other data except (possibly) virtual bases. In particular, it:
- has no non-static data members other than zero-width bitfields,
- has no direct base classes that are not either empty, nearly empty, or virtual,
- has at most one non-virtual, nearly empty direct base class, and
- has no proper base class that is empty, not morally virtual, and at an offset other than zero.
I ran across this while researching the effect of nearly empty virtual bases on object size, vtable size, and virtual call overhead.
回答2:
C++ has something called an "empty base optimization". If a class has no members, it doesn't need to take up space when it's used as a base class. An example of why this is important is std::unary_function<T, U>
. It exists to provide you with an easy set of typedefs. Those typedefs should not contribute to the size of your functor class.
If you have a base class with a vtable pointer, this pointer can likely be shared with the derived class. You simply create a vtable for the derived class which adds its own methods after that of the base class.
You can now achieve a similar "no extra overhead" base class. Apparently GCC calls that "nearly empty".
回答3:
I suppose it's to differentiate it from "empty", which is what you get if compile a class with no members at all. "nearly-empty" seems to mean it hasa vtable and nothing else.
回答4:
It only has a vtable, no data fields.
来源:https://stackoverflow.com/questions/1152958/what-is-a-nearly-empty-class