====== Going Native 2013 ======
Herb Sutter had a couple of favorite C++ few-liners. Watch the video here: [[http://channel9.msdn.com/Events/GoingNative/2013/My-Favorite-Cpp-10-Liner|My Favorite C++ 10-liner]].
A complete reference-counted object cache.
From C++98 it uses map operator[]'s auto-insertion.
From C++11 it uses:
* auto
* mutex, lock_guard
* Thread-safe fn statics
* shared_ptr and weak_ptr
* Thread-safe.lock()
shared_ptr get_widget( int id ) {
static map< int, weak_ptr > cache;
static mutex m;
lock_guard hold(m);
auto sp = cache[id].lock(); // cache[id] returns a weak_ptr. lock() returns the shared_ptr
if( !sp )
cache[id] = sp = load_widget(id);
return sp;
}
In C++11, the following code is thread safe! It's the Meyers Singleton.
* Thread safe fn statics
* Does destruction. No need for Alexandrescu's various destruction policies anymore!
widget& instance() {
static widget w;
return w;
}
This one uses the **[[http://libcinder.org/|Cinder C++ Library]]**.
#include "cinder/app/AppBasic.h"
#include "cinder/dx/dx.h"
#include
using namespace ci;
using namespace ci::app;
class MyApp:public AppBasic {
std::vector< Vec2f > points;
public:
void mouseDrag( MouseEvent e ) {
points.push_back( e.getPos() );
}
void draw() {
dx::clear( Color( 0.1f, 0.1f, 0.15f ) );
dx::color( 1.0f, 0.5f, 0.25f );
dx::begin( GL_LINE_STRIP );
for( auto& e: points )
dx::vertex( e );
dx::end();
}
};
CINDER_APP_BASIC( MyApp, RendererDx )
===== Advanced Optimization =====
Use lambda in place of std::bind to save memory. A std::bind() on a pointer-to-member-function will allocate 24 bytes on the heap for the bind structure. If instead you use a lambda, then this fits into 4 bytes and avoids any allocation.
Replace:
g(this, std::bind(&m_f, this)),
With:
g(this, [this](){this->m_f();}),
Note that subtle changes to object lifetimes is possible. This code:
std::bind(f, std::weak_ptr