Spurious imports in Phobos ?

Jonathan M Davis jmdavisProg at gmx.com
Wed Nov 9 10:14:20 PST 2011


On Wednesday, November 09, 2011 05:42 Jacob Carlborg wrote:
> On 2011-11-09 14:16, Trass3r wrote:
> >> Phobos contains a lot of templates and if a template isn't
> >> instantiated it won't be compiled. Meaning there can be hidden compile
> >> errors if you start to remove imports and they will not show until a
> >> template that uses something from the import is instantiate.
> > 
> > Wouldn't it be possible/better then to move the imports into those
> > template functions?
> 
> I probably would. Having imports in non-global scope is quite a new
> feature and I guess nobody has either thought of the idea or just
> haven't had the time yet.

You also get the question of what to do if a lot of templated functions use 
the same import. Sure, you could put the import in each individual function so 
that it doesn't get imported if you don't use any of those functions, but then 
you've duplicated the same import in a bunch of places. It's not an entirely 
clear issue.

And I don't think that it ever affects the size of the executable. If you're 
dealing with static libraries, then all of the functions that aren't used 
shouldn't be compiled in. And if you're using a shared library, everything in 
the library is going to need to be there anyway (which would just affect the 
size of the library, not the executably anyway). So, I don't see how 
unnecessary imports would be a problem with regards to executable size.

The bigger problem is static constructors and circular dependencies. If the 
wrong modules import one another when they don't need to, it can result in 
circular dependencies which will then cause the runtime to exit with an error 
when you try and run your program. So that - and the fact that it's just 
cleaner - is a good reason to not have unnecessary imports in a module. 
However, the circular dependency situation can be made _worse_ by putting 
imports within a template, since not only is there no way to detect the 
circular dependency at compile time, but whether you _have_ a circular 
dependency can depend on whether a particular template was instantiated or 
not. So, this is definitely not a clear-cut issue.

I'd definitely say that if there are only one or two functions in a module 
which need a particular import, then it's probably better to restrict that 
import to those functions, but beyond that, it's better to just stick them at 
the module level. But since (as you point out) local imports are quite new, I 
really don't think that much of Phobos is taking advantage of them even if it 
should be. That'll probably change over time, but it's not exactly a high 
priority.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list