[Insight-users] Specializing ITK classes into libraries to speed up compilation

Luis Ibanez luis.ibanez@kitware.com
Tue, 18 Feb 2003 01:37:36 -0500


Hi Parag,

Slow compilation is certainly the price to pay
for the flexibility of Generic Programming.

Building libraries can help you on this, but only
if you managed to hide ITK headers from your code.

Unfortunately deriving from itk classes will not
do the trick since the ITK headers will have to
to be compiled along with the headers of your
classes.

You may want to do something like encapsulate ITK
classes inside C++ non templated classes. Make sure
that the ITK headers are not included in the headers
of your encapsulating class, but rather on their
  respective cxx files. This means that ITK classes
(at least the templated ones) should not be member
variables of your encapsulating class.

If you need to pass objects like ITK images around
you could use the fact that the itkDataObject is
not templated and is the base class of the image.
You could in this way, pass pointers to itkDataObject
and downcast them inside the .cxx files using
dynamic_cast.

Please let us know if you find any problem with
this approach.

Thanks


Luis


---------------------------------


Parag Chandra wrote:
> Hey all,
>  
> I have noticed that the more ITK classes I include in my program, the 
> longer my program takes to build. In fact, the build time seems to be 
> pretty constant even if I do something as simple as adding a comment to 
> the main source file, and I suspect this is because all the ITK classes 
> have to be constantly recompiled. What I have started to do is create a 
> library of classes that are simple specializations of the ITK classes 
> that I use, templated over the only type of image that I use (<double, 
> 2>). So I have a set of classes sort of like this:
>  
> namespace aks {
> namespace double2 {
> class Image : public itk::Image<double, 2>
> {
> // define standard class typedefs, New macro, default constructor
> };
>  
> class ImageReader : public itk::ImageFileReader<aks::double2::Image>
> {
> // define standard class typedefs, New macro, default constructor
> };
>  
> etc.
> }
> }
>  
> that I can then compile into a library. It works, but I have only done 
> this for a couple of classes so far, so I do not see any noticeable 
> speedup in compilation time just yet. What I was wondering is if anyone 
> else out there has tried something like this and could comment before I 
> (potentially) waste my time in vain. I think at one point there was even 
> some discussion on the ITK mailing list regarding this sort of thing, 
> but I don't think anything ever came of it so maybe others have already 
> decided it's not worth the time.
>  
> Thanks,
> Parag Chandra