141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
|  | /* ----------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | ||
|  |  * Atlanta, Georgia 30332-0415 | ||
|  |  * All Rights Reserved | ||
|  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | ||
|  | 
 | ||
|  |  * See LICENSE for the license information | ||
|  | 
 | ||
|  |  * -------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @file    timeVirtual.cpp | ||
|  |  * @brief   Time the overhead of using virtual destructors and methods | ||
|  |  * @author  Richard Roberts | ||
|  |  * @date    Nov 6, 2011 | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <gtsam/base/timing.h>
 | ||
|  | 
 | ||
|  | #include <boost/shared_ptr.hpp>
 | ||
|  | #include <boost/intrusive_ptr.hpp>
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | using namespace boost; | ||
|  | using namespace gtsam; | ||
|  | 
 | ||
|  | struct DtorTestBase { | ||
|  |   DtorTestBase() { cout << "  DtorTestBase" << endl; } | ||
|  |   virtual ~DtorTestBase() { cout << "  ~DtorTestBase" << endl; } | ||
|  | }; | ||
|  | 
 | ||
|  | struct DtorTestDerived : public DtorTestBase { | ||
|  |   DtorTestDerived() { cout << "  DtorTestDerived" << endl; } | ||
|  |   virtual ~DtorTestDerived() { cout << "  ~DtorTestDerived" << endl; } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | struct VirtualBase { | ||
|  |   VirtualBase() { } | ||
|  |   virtual void method() = 0; | ||
|  |   virtual ~VirtualBase() { } | ||
|  | }; | ||
|  | 
 | ||
|  | struct VirtualDerived : public VirtualBase { | ||
|  |   double data; | ||
|  |   VirtualDerived() { data = rand(); } | ||
|  |   virtual void method() { data = rand(); } | ||
|  |   virtual ~VirtualDerived() { } | ||
|  | }; | ||
|  | 
 | ||
|  | struct NonVirtualBase { | ||
|  |   NonVirtualBase() { } | ||
|  |   ~NonVirtualBase() { } | ||
|  | }; | ||
|  | 
 | ||
|  | struct NonVirtualDerived : public NonVirtualBase { | ||
|  |   double data; | ||
|  |   NonVirtualDerived() { data = rand(); } | ||
|  |   void method() { data = rand(); } | ||
|  |   ~NonVirtualDerived() { } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | int main(int argc, char *argv[]) { | ||
|  | 
 | ||
|  |   // Virtual destructor test
 | ||
|  |   cout << "Stack objects:" << endl; | ||
|  |   cout << "Base:" << endl; | ||
|  |   { DtorTestBase b; } | ||
|  |   cout << "Derived:" << endl; | ||
|  |   { DtorTestDerived d; } | ||
|  | 
 | ||
|  |   cout << "Heap objects:" << endl; | ||
|  |   cout << "Base:" << endl; | ||
|  |   { DtorTestBase *b = new DtorTestBase(); delete b; } | ||
|  |   cout << "Derived:" << endl; | ||
|  |   { DtorTestDerived *d = new DtorTestDerived(); delete d; } | ||
|  |   cout << "Derived with base pointer:" << endl; | ||
|  |   { DtorTestBase *b = new DtorTestDerived(); delete b; } | ||
|  | 
 | ||
|  |   int n = 10000000; | ||
|  | 
 | ||
|  |   { | ||
|  |   VirtualBase** b = new VirtualBase*[n]; | ||
|  |   gttic_(Virtual); | ||
|  |   gttic_(new); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     b[i] = new VirtualDerived(); | ||
|  |   gttoc_(new); | ||
|  |   gttic_(method); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     b[i]->method(); | ||
|  |   gttoc_(method); | ||
|  |   gttic_(dynamic_cast); | ||
|  |   for(int i=0; i<n; ++i) { | ||
|  |     VirtualDerived* d = dynamic_cast<VirtualDerived*>(b[i]); | ||
|  |     if(d) | ||
|  |       d->method(); | ||
|  |   } | ||
|  |   gttoc_(dynamic_cast); | ||
|  |   gttic_(delete); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     delete b[i]; | ||
|  |   gttoc_(delete); | ||
|  |   gttoc_(Virtual); | ||
|  |   delete[] b; | ||
|  |   } | ||
|  | 
 | ||
|  | 
 | ||
|  |   { | ||
|  |   NonVirtualDerived** d = new NonVirtualDerived*[n]; | ||
|  |   gttic_(NonVirtual); | ||
|  |   gttic_(new); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     d[i] = new NonVirtualDerived(); | ||
|  |   gttoc_(new); | ||
|  |   gttic_(method); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     d[i]->method(); | ||
|  |   gttoc_(method); | ||
|  |   gttic_(dynamic_cast_does_nothing); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     d[i]->method(); | ||
|  |   gttoc_(dynamic_cast_does_nothing); | ||
|  |   gttic_(delete); | ||
|  |   for(int i=0; i<n; ++i) | ||
|  |     delete d[i]; | ||
|  |   gttoc_(delete); | ||
|  |   gttoc_(NonVirtual); | ||
|  |   delete[] d; | ||
|  |   } | ||
|  | 
 | ||
|  |   tictoc_finishedIteration_(); | ||
|  |   tictoc_print_(); | ||
|  | 
 | ||
|  |   return 0; | ||
|  | } |