On Oct  3, 2012, Jason Merrill <ja...@redhat.com> wrote:

> int& lazy_i()
> {
>   static int i = init;
>   return i;
> }

> If the initialization is expensive or order-sensitive, this is a
> useful alternative to initialization on load

> An interesting property of such functions is that they only have
> side-effects the first time they are called, so subsequent calls can
> be optimized away to just use the return value of the first call.

> Currently there is no way to express this in GCC so that the
> optimizers know that multiple calls are redundant.


On Oct  4, 2012, Jakub Jelinek <ja...@redhat.com> wrote:

> The singleton function really is

> void singleton (void)
> {
>   static __thread bool initialized;
>   if (!initialized) {
>     initialized = true;
>     call_some_function_that_may_modify_memory ();
>   }
> }

> and has side effects just first time in a thread.

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).

-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

Reply via email to