On 9/20/16 3:42 PM, crimaniak wrote:
On Tuesday, 20 September 2016 at 13:35:27 UTC, Steven Schveighoffer wrote:
Note that if you don't import the module that contains the static
ctor, it should be trimmed by the linker.
Let's imagine linker can trim even imported module with static ctor, if
we have something like:
immutable string executablePath;
@local shared static this()
import std.file : thisExePath;
executablePath = thisExePath();
and there is no references to executablePath. Here it would be useful, I
think. Attribute @local (or @module? the name does not matter) mean this
block used only to init other symbols in this module so it can be
skipped if no references.
But if this is all that is in the module, why import the module if you
aren't going to use any of it?
I would absolutely caution you from putting static this() inside any
template. Unfortunately, due to the way D generates these static
constructors, any module that uses staticMemoize, or *imports a module
that uses it*, will be marked as having a static constructor, and will
potentially create cycles.
Please be more detail about cycles. Do you mean something like this?
Sort of, I mean this:
In other words, because the template has a static ctor in it, just
instantiating it in your unrelated module puts static ctor in your
module. And then cycles can appear that you wouldn't expect to happen.