geode-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ernest Burghardt <eburgha...@pivotal.io>
Subject Re: [Discuss] Investigation of C++ object return types
Date Thu, 14 Sep 2017 21:09:43 GMT
Calling a vote for:

- Raw pointer
- shard pointer

+1 raw Pointer, I had to look up RVO and am new to std::move(s)

On Thu, Sep 14, 2017 at 3:02 PM, Michael William Dodge <mdodge@pivotal.io>
wrote:

> I generally dig reference-counted pointers for avoiding lifetime issues
> with objects allocated off the heap but I can live with bare pointers, too.
>
> Sarge
>
> > On 13 Sep, 2017, at 16:25, Mark Hanson <mhanson@pivotal.io> wrote:
> >
> > Hi All,
> >
> > I favor the “pointer" approach that is identified in the code sample.
> There is greater clarity and less bytes seemingly created and written. We
> do sacrifice the potential ease of using an object, but in all, I think the
> way our code is structured. It is not conducive to do a value approach,
> from an efficiency standpoint,  because of our use of the pimpl model.
> >
> > Thanks,
> > Mark
> >
> >> On Sep 12, 2017, at 11:09 AM, Jacob Barrett <jbarrett@pivotal.io>
> wrote:
> >>
> >> My biggest concern with this model is that access to the public Cache
> >> object from other public objects results in additional allocations of a
> >> Cache value. Think about when we are inside a Serializable object and we
> >> access the Cache from DataOutput.
> >>
> >> As value:
> >> Serializable* MyClass::fromData(DataInput& dataInput) {
> >> auto cache = dataOutput.getCache();
> >> ...
> >> }
> >> In this the value of cache will RVO the allocation of Cache in the
> getCache
> >> call into the stack of this method, great. The problem is that Cache
> must
> >> contain a std::shared_ptr<CacheImpl> which means that each allocation
> is 8
> >> bytes (pointer to control block and pointer to CacheImpl) as well as
> having
> >> to increment the strong counter in the control block. On exit/descope,
> the
> >> Cache will have to decrement the control block as well.
> >>
> >> Using current shared_ptr pimple model:
> >> Serializable* MyClass::fromData(DataInput& dataInput) {
> >> auto& cache = dataOutput.getCache();
> >> ...
> >> }
> >> We only suffer the ref allocation of 4 bytes and no ref count. Since
> this
> >> function call can't survive past the lifespan of Cache/CacheImpl they
> don't
> >> need to have shared_ptr and refcounting.
> >>
> >> Given that this method could be called numerous times is the overhead of
> >> the value version going to be a significant performance issue?
> >>
> >> I worry that moves and RVO is just beyond most developers. Heck I didn't
> >> know anything about it until we started exploring it.
> >>
> >>
> >>
> >> -Jake
> >>
> >>
> >> On Tue, Sep 12, 2017 at 8:06 AM David Kimura <dkimura@pivotal.io>
> wrote:
> >>
> >>> Follow up of attached discussion after more investigation.  I created
> an
> >>> example of returning Cache as shared pointer versus raw value:
> >>>
> >>>   https://github.com/dgkimura/geode-native-sandbox
> >>>
> >>> I still like returning by value as it lets the user do what they want
> with
> >>> their object.
> >>>
> >>>   // Here user creates object on their stack.
> >>>   auto c = CacheFactory::createFactory().create();
> >>>
> >>>   // Here user creates smart pointer in their heap.
> >>>   auto cptr =
> >>> std::make_shared<Cache>(CacheFactory::createFactory().create());
> >>>
> >>> Difficulty of implementing this is high due to circular dependencies of
> >>> Cache/CacheImpl as well as objects hanging off CacheImpl that return
> >>> Cache.  We must be extra careful when dealing with move/copy semantics
> of
> >>> Cache/CacheImpl.
> >>>
> >>> Alternative, is to keep as is and only permit heap allocations from
> >>> factory using shared pointers.
> >>>
> >>> Thanks,
> >>> David
> >>>
> >
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message