- **C++**
(*http://www.velocityreviews.com/forums/f39-c.html*)

- - **Copy constructor called from member function?**
(*http://www.velocityreviews.com/forums/t285238-copy-constructor-called-from-member-function.html*)

Copy constructor called from member function?Hi,
Although I've been using C++ for a while, I've only recently started writing my own template classes so forgive me if this is a silly question. I have a matrix class, mgMatrix, that is templatised so that it can be a matrix of any type. It has three data members, two integers for the number of rows and columns in it, and a vector of size rows*columns to hold all the data. I am trying to test the speed of this class on a 10000*10000 matrix and I am running into memory problems. Specifically when using my own += operator defined as: template<class S> mgMatrix<T> operator+=(S scalar) { std::transform(begin(), end(), begin(), std::bind2nd(std::plus<T>(), scalar)); return *this; }; During testing, T=int and S=int (I use two types here to allow int scalars to be added to double matrices), and scalar=0. The memory error comes because this function calls the mgMatrix copy constructor and the call to vector.resize(10000*10000) returns an out-of-memory exception. BTW, mgMatrix::begin() and mgMatrix::end() are wrappers for the vector functions of the same name. Can anyone tell me why the copy constructor is called from the above function, when invoked as: testMatrix += 0;? If required, I can post the full source code online. Cheers, Craig Nicol. |

Re: Copy constructor called from member function?Craig Nicol wrote:
> > Hi, > > Although I've been using C++ for a while, I've only recently started > writing my own template classes so forgive me if this is a silly question. > > I have a matrix class, mgMatrix, that is templatised so that it can be a > matrix of any type. It has three data members, two integers for the > number of rows and columns in it, and a vector of size rows*columns to > hold all the data. > > I am trying to test the speed of this class on a 10000*10000 matrix and > I am running into memory problems. Specifically when using my own += > operator defined as: > > template<class S> mgMatrix<T> operator+=(S scalar) { > std::transform(begin(), end(), begin(), std::bind2nd(std::plus<T>(), > scalar)); return *this; }; > > During testing, T=int and S=int (I use two types here to allow int > scalars to be added to double matrices), and scalar=0. > > The memory error comes because this function calls the mgMatrix copy > constructor and the call to vector.resize(10000*10000) returns an > out-of-memory exception. > > BTW, mgMatrix::begin() and mgMatrix::end() are wrappers for the vector > functions of the same name. > > Can anyone tell me why the copy constructor is called from the above > function, when invoked as: testMatrix += 0;? > return *this; A temporary object is created, not used by the caller and gets destroyed. -- Karl Heinz Buchegger kbuchegg@gascad.at |

Re: Copy constructor called from member function?Craig Nicol wrote:
> Although I've been using C++ for a while, I've only recently started > writing my own template classes so forgive me if this is a silly question. > > I have a matrix class, mgMatrix, that is templatised so that it can be a > matrix of any type. It has three data members, two integers for the > number of rows and columns in it, and a vector of size rows*columns to > hold all the data. > > I am trying to test the speed of this class on a 10000*10000 matrix and That's a 100 million element matrix, and each element is what, a double? That's 800 MB. Create a couple of those and you're likely to run out of memory pretty quickly... > I am running into memory problems. Specifically when using my own += > operator defined as: > > template<class S> mgMatrix<T> operator+=(S scalar) { Just like any other assignment operator, += should return a reference, and not an object: template<class S> mgMatrix<T>& operator +=(S scalar) { ... > std::transform(begin(), end(), begin(), std::bind2nd(std::plus<T>(), > scalar)); return *this; }; > > During testing, T=int and S=int (I use two types here to allow int > scalars to be added to double matrices), and scalar=0. > > The memory error comes because this function calls the mgMatrix copy > constructor and the call to vector.resize(10000*10000) returns an > out-of-memory exception. Of course. You asked it to return another object of mgMatrix<T> type. > > BTW, mgMatrix::begin() and mgMatrix::end() are wrappers for the vector > functions of the same name. > > Can anyone tell me why the copy constructor is called from the above > function, when invoked as: testMatrix += 0;? Because you defined it as returning an object. > If required, I can post the full source code online. Not required. Victor |

Re: Copy constructor called from member function?Victor Bazarov wrote:
> Craig Nicol wrote: > >> Although I've been using C++ for a while, I've only recently started >> writing my own template classes so forgive me if this is a silly >> question. >> >> I have a matrix class, mgMatrix, that is templatised so that it can >> be a matrix of any type. It has three data members, two integers for >> the number of rows and columns in it, and a vector of size >> rows*columns to hold all the data. >> >> I am trying to test the speed of this class on a 10000*10000 matrix and > > > That's a 100 million element matrix, and each element is what, a double? > That's 800 MB. Create a couple of those and you're likely to run out of > memory pretty quickly... That I realise. I'm stress-testing it to see how it falls over. If I don't push it to the limits, I'm never going to test all the exceptions. Better it fails now than when its embedded in another program. >> I am running into memory problems. Specifically when using my own += >> operator defined as: >> >> template<class S> mgMatrix<T> operator+=(S scalar) { > > > Just like any other assignment operator, += should return a reference, > and not an object: > > template<class S> mgMatrix<T>& operator +=(S scalar) { ... That's the problem. Thanks for your help. Now I just need to get VC++ to release it's lock on the *.pdb file :( Cheers, Craig Nicol. |

All times are GMT. The time now is 05:42 AM. |

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.

SEO by vBSEO ©2010, Crawlability, Inc.