There is a little code example here:
struct Data {
};
struct Init {
Data *m_data;
Init() : m_data(new Data) { }
~Init() {
delete m_data;
Your m_initType
actually distinguishes between two kinds of Object
s - those which own their memory and those which don't. Also, you mention that actually there are many kinds of Object
s which can be initialized with all sorts of inputs; so actually there are all sorts of Object
s. That would suggest Object
should better be some abstract base class. Now, that wouldn't speed anything up or avoid destructor calls, but it might make your design more reasonable. Or maybe Object
could be an std::variant
(new in C++17, you can read up on it).
But then, you say that temporary Object
s are "used frequently". So perhaps you should go another way: In your example, suppose you had
template class Object;
which you would then specialize for the non-owning case, with only a const Init& constructor and default destruction, and the owning case, with only an Init&& constructor (considering the two you mentioned) and a destructor which delete
s. This would mean templatizing the code that uses Object, which many mean larger code size, as well as having to know what kind of Object
s you pass in; but if would avoid the condition check if that really bugs you so much.
I'd like to decrease code size
I kind of doubt that you do. Are you writing code for an embedded system? In that case it's kind of strange you use lots of temporary Object
s which are sort-of polymorphic.