On 10/11/2012 11:14 AM, Alexandre Oliva wrote:
How about marking the singleton containing the call to the initializer
as always_inline, but not the initializer itself?

The compiler can then infer that initialized is set on the first inlined
call and optimize away subsequent tests and initializer calls
(call_some_function_that_may_modify_memory).

That would require exporting the initialized flag in addition to the initializer function; currently it is private to the translation unit with the initializer function. That is, the wrapper currently looks like

int& i_wrap()
{
  if (i_init) i_init();
  return i;
}

and your suggestion would change it to

int& i_wrap()
{
  if (i_init && !i_initialized) { i_initialized = true; i_init(); }
  return i;
}

In previous discussions, people thought this would be less efficient.

Jason

Reply via email to