Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
vo001_AdoptOrOwnMemory.py
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
13import ROOT
14
15# We use this class for didactic purposes: upon copy, a line is printed to the terminal.
16
17ROOT.gInterpreter.Declare('''
18class UponCopyPrinter {
19public:
20 UponCopyPrinter() = default;
21 UponCopyPrinter(UponCopyPrinter &&) = default;
22 UponCopyPrinter(const UponCopyPrinter &) { std::cout << "Invoking copy c'tor!" << std::endl; }
23};
24''')
25
26RVec_UponCopyPrinter = ROOT.ROOT.VecOps.RVec(ROOT.UponCopyPrinter)
27
28# One of the essential features of RVec is its ability of adopting and owning memory.
29
30# Let's create an RVec of UponCopyPrinter instances. We expect no printout:
31v = RVec_UponCopyPrinter(3)
32
33# Let's adopt the memory from v into v2. We expect no printout:
34v2 = RVec_UponCopyPrinter(v.data(), v.size())
35
36# OK, let's check the addresses of the memory associated to the two RVecs It is the same!
37print("%s and %s" %(v.data(), v2.data()))
38
39# Now, upon reallocation, the RVec stops adopting the memory and starts owning it. And yes,
40# a copy is triggered. Indeed internally the storage of the RVec is an std::vector. Moreover,
41# the interface of the RVec is very, very similar to the one of std::vector: you have already
42# noticed it when the `data()` method was invoked, right?
43v2.resize(4)
44
45# Of course, now the addresses are different.
46print("%s and %s" %(v.data(), v2.data()))