Logo ROOT   6.18/05
Reference Guide
vo001_AdoptOrOwnMemory.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_vecops
3/// \notebook -nodraw
4/// In this tutorial we learn how the RVec class can be used to
5/// adopt existing memory or allocate some.
6///
7/// \macro_code
8/// \macro_output
9///
10/// \date May 2018
11/// \author Danilo Piparo
12
13// We use this class for didactic purposes: upon copy, a line is printed to the terminal.
14class UponCopyPrinter {
15public:
16 UponCopyPrinter() = default;
17 UponCopyPrinter(UponCopyPrinter &&) = default;
18 UponCopyPrinter(const UponCopyPrinter &) { std::cout << "Invoking copy c'tor!" << std::endl; }
19};
20
21using namespace ROOT::VecOps;
22
24{
25
26 // One of the essential features of RVec is its ability of adopting and owning memory.
27 // Internally this is handled by the ROOT::Detail::VecOps::RAdoptAllocator class.
28
29 // Let's create an RVec of UponCopyPrinter instances. We expect no printout:
31
32 // Let's adopt the memory from v into v2. We expect no printout:
33 RVec<UponCopyPrinter> v2(v.data(), v.size());
34
35 // OK, let's check the addresses of the memory associated to the two RVecs It is the same!
36 std::cout << v.data() << " and " << v2.data() << std::endl;
37
38 // Now, upon reallocation, the RVec stops adopting the memory and starts owning it. And yes,
39 // a copy is triggered. Indeed internally the storage of the RVec is an std::vector. Moreover,
40 // the interface of the TVec is very, very similar to the one of std::vector: you have already
41 // noticed it when the `data()` method was invoked, right?
42
43 v2.push_back(UponCopyPrinter());
44
45 // Of course, now the addresses are different.
46 std::cout << v.data() << " and " << v2.data() << std::endl;
47}
SVector< double, 2 > v
Definition: Dict.h:5
A "std::vector"-like collection of values implementing handy operation to analyse them.
Definition: RVec.hxx:272