Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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.
14 class UponCopyPrinter {
15 public:
16  UponCopyPrinter() = default;
17  UponCopyPrinter(UponCopyPrinter &&) = default;
18  UponCopyPrinter(const UponCopyPrinter &) { std::cout << "Invoking copy c'tor!" << std::endl; }
19 };
20 
21 using namespace ROOT::VecOps;
22 
23 void vo001_AdoptOrOwnMemory()
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:
30  RVec<UponCopyPrinter> v(3);
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 RVec 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 }