exception.cpp proves that catching an exception by ref is more optimal.
This commit is contained in:
85
cpp/exception.cpp
Normal file
85
cpp/exception.cpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/* Check cf5-opt.vim defs.
|
||||||
|
VIM: let g:lcppflags="-std=c++11 -O2 -pthread"
|
||||||
|
VIM: let g:wcppflags="/O2 /EHsc /DWIN32"
|
||||||
|
VIM: let g:cppflags=g:Iboost.g:Itbb
|
||||||
|
VIM: let g:ldflags=g:Lboost.g:Ltbb.g:tbbmalloc.g:tbbmproxy
|
||||||
|
VIM: let g:ldlibpath=g:Bboost.g:Btbb
|
||||||
|
VIM: let g:argv=""
|
||||||
|
VIM-: let g:cf5output=0
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
/*
|
||||||
|
This experiment proves that catching an exception by reference
|
||||||
|
is more effective since it eliminates unneeded copy.
|
||||||
|
|
||||||
|
Also re-throwing an exception throws the original exception but not
|
||||||
|
the exception caught.
|
||||||
|
*/
|
||||||
|
struct ex
|
||||||
|
{
|
||||||
|
mutable int v;
|
||||||
|
|
||||||
|
ex()
|
||||||
|
: v(0)
|
||||||
|
{
|
||||||
|
std::cout << "ex::default" << std::endl;
|
||||||
|
}
|
||||||
|
ex( const ex& e )
|
||||||
|
: v(e.v)
|
||||||
|
{
|
||||||
|
std::cout << "ex::copy" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ex& operator = ( const ex& e )
|
||||||
|
{
|
||||||
|
v = e.v;
|
||||||
|
std::cout << "ex::op =" << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void a ()
|
||||||
|
{
|
||||||
|
throw ex();
|
||||||
|
}
|
||||||
|
|
||||||
|
void b ()
|
||||||
|
try {
|
||||||
|
a();
|
||||||
|
} catch(ex& e) {
|
||||||
|
e.v |= 1;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
void c ()
|
||||||
|
try {
|
||||||
|
b();
|
||||||
|
} catch(const ex& e) {
|
||||||
|
e.v |= 2;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
void d ()
|
||||||
|
try {
|
||||||
|
c();
|
||||||
|
} catch( ex e) {
|
||||||
|
e.v |= 4;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main ( void )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
d();
|
||||||
|
}
|
||||||
|
catch ( const ex& e )
|
||||||
|
{
|
||||||
|
std::cout << e.v << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user