[31.5] What are relative costs of the 3 performance hits associated with allocating member objects from the freestore?
The three performance hits are enumerated in the previous FAQ:
- By itself, an extra layer of indirection is small
potatoes
- Freestore allocations can be a performance issue (the performance of
the typical implementation of malloc() degrades when there are many
allocations; OO software can easily become "freestore bound" unless you're
careful)
- The extra dynamic binding comes from having a pointer rather than an
object. Whenever the C++ compiler can know an object's exact class,
virtual function calls can be
statically bound, which allows inlining. Inlining allows zillions
(would you believe half a dozen :-) optimization opportunities such as
procedural integration, register lifetime issues, etc. The C++ compiler can
know an object's exact class in three circumstances: local variables,
global/static variables, and fully-contained member objects
Thus fully-contained member objects allow significant optimizations that
wouldn't be possible under the "member objects-by-pointer" approach. This is
the main reason that languages which enforce reference-semantics have
"inherent" performance challenges.
Note: Please read the next three FAQs to get a balanced perspective!