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