BTW if you see pointers to SGVectors being passed around, that should probably be changed. Can you share the locations of it? H
2018-05-12 10:46 GMT+01:00 Heiko Strathmann <[email protected]>: > Hi > > I cc the list as others might have the same question. > > SGVector (same for SGMarix) is a memory wrapper for c/c++ arrays, that > implements an automatic reference counter and therefore shared ownership. > If you assign the vector to another one using operator=, (or similarly, > pass it by value), then what happens is that a new SGVector structure is > generated, but it points to the same memory. Once all SGVector instances > that point to the memory block are destroyed, the memory block is freed. > This is why passing it by value is relatively efficient (it doesnt copy > the actual memory) and in particular it allows shared ownership, such as > SGVector<float64_t> get_vector() { return m_vector; } > which returns returns a copy of the SGVector instance that points to the > same memory that m_vector does. > This would allow me to modify a member variable as > auto vec = obj->get_vector() > vec[0] = 5; // now the memory block where Object::m_vector points to is > changed > > Now sometimes, helper methods that accept vectors are called many times > (in a loop). Copy- assigning the SGVector doesnt copy the memory block but > creates a new instance everytime, which can be slow. This is why we > sometimes pass around references, in particular const references make a > speed difference (see linalg). > There should never be the need to pass a pointer to an SGVector to a > helper method. > > Summary answer to your questions: > Passing SGVector by value creates a shared ownership of a fixed memory > block. > With respect to the memory block, passing SGVector by value allows for > what you called inplace updates (of the memory block). > Whenever you pass vectors to a helper method, you dont need to share > ownership, and therefore you can pass a by reference (if you want to > modify) or even const reference (if you just want to read). Obviously, > shared ownership comes at a (small) cost, which you might want to avoid in > low-level methods (say linalg). > > Hope that helps! > H > > > 2018-05-12 2:54 GMT+01:00 Elfarouk Harb <[email protected]>: > >> Hi Heiko, >> >> Just a quick question about something that is confusing me a bit. Some >> times, if there is a need to do an inplace update of a variable, I see that >> SGVector<T> is passed by a pointer, meaning: >> SGVector<T>* ref_vars. However, sometimes, they are passed to functions >> which do in place updates but they are passed by value: SGVector<T> >> ref_vars (example: http://shogun-toolbox.org/api/ >> latest/DescendUpdaterWithCorrection_8cpp_source.html#l00054 >> variable_reference >> is passed by value but the function acts on it as if it is passed by >> reference). Is SGVector somehow being passed by reference in both ways >> or am I missing something? >> >> Thanks a lot, >> Elfarouk >> > >
