On Mon, 09 Aug 2010 11:31:18 -0400, Simen kjaeraas <[email protected]> wrote:

Steven Schveighoffer <[email protected]> wrote:

 class C
{
   private Mutable!(int) cache = -1;
int expensiveFunction() const { return cache == -1 ? cache = _expensiveFunctionImpl() : cache; }
   private int _expensiveFunctionImpl() const {...}
}
If this is undefined, then something like this cannot be relied on, even when performance is critical.
 -Steve

I really can't see how the compiler could make that work, without destroying most of the benefits of const. For example, if that code is legal, it disallows most const-related optimisation.

Why not? What possible optimization can the compiler do here? Mutable has an assign operation that is labeled as const, it should be callable by the compiler.

I haven't really seen what const optimizations can be, so maybe an example (even if unimplemented) is helpful.

The compiler may decide to store the value of cache in a register, and
use that value instead of fetching it after _expensiveFunctionImpl is
called. That's the simplest example I could come up with.


The compiler will rewrite the code as follows:

return cache.opEquals(-1) ? cache.opAssign(_expensiveFunctionImpl()) : cache.xxx;

I'm assuming for cache.xxx that it's some sort of alias this to a getter function. All of these function would be const.

We can define the opAssign in such a way that it cannot be inlined, forcing the compiler to assume nothing about the result of opAssign.

Note also that the optimization you stated is not possible, even without casting away const, but would be possible on an immutable class. But the fact that the compiler cannot peek into the implementation of the opAssign means it's forced to make no assumptions about the result of opAssign.

How does one write a conforming compiler that alters the result of this?

-Steve

Reply via email to