On 04/03/2018 07:36 AM, ag0aep6g wrote:
For constructors, we say that the first assignment is actually initialization. The compiler might or might not put the .init value down before calling the constructor. Doesn't matter, because the constructor will overwrite it anyway, and nothing of value is lost.

What happens in fact is you are guaranteed the .init value is there. Much later, well after semantic checking, the backend optimizer removes dead assignments on primitive data.

We can do the same with the postblit function: First assignment is actually initialization. When the compiler sees that the postblit function initializes a field, it can skip that field when blitting.

What if the user code reads the value?

* Often people use this(this) to bump a reference count a la "if (pcnt) ++*pcnt;"

* People may pass the field by reference to an opaque function. What type does the field have?

But it can also just blit the whole struct, because it doesn't matter if the value just gets overwritten.

In other words, a postblit function can either:

1) use the blitted value as a starting point, like a constructor can use the .init value, or it can
2) initialize the field itself.

Would make perfect sense to me.

In case (1) things can get quite confusing. Inside a postblit,

field = TypeOfField(100);

is a call to the constructor, whereas

field = TypeOfField(field.x + 100);

is a call to the assignment operator.


Andrei

Reply via email to