void foo() {
// initialized once when foo is first called
static auto lazy_data = ...;
// use lazy_data...
}
As of c++11, the compiler is required to make this threadsafe (initializer only runs once, even if foo() is called concurrently), typically by inserting locks.
Since this only applies to the initializer, for complex initialization a self-executing lambda can be used:
void foo() {
static auto lazy_data = []{
auto data = new Whatever();
// initialize data...
return data;
}();
// use lazy_data...
}
Since this only applies to the initializer, for complex initialization a self-executing lambda can be used: