3DLDF 1.1.5 is the first release that contains template functions,
namely
template <class C> C* create_new()
, which is defined in
creatnew.web
, and
template <class Real> Real get_second_largest()
, which is defined
in gsltmplt.web
.
See Dynamic Allocation of Shapes, and
Get Second Largest Real.
In order for template functions to be instantiated correctly, their
definitions must be available in each compilation unit where
specializations are declared or used. For non-template functions, it
suffices for their declarations to be available, and their
definitions are found at link-time. For this reason, the
definitions of create_new()
and get_second_largest()
are
in their own CWEB files, and are written to their own header files. The
latter are included in the other CWEB files that need them.
In addition, AM_CXXFLAGS = -frepo
has been added to the file
Makefile.am
in 3DLDF-1.1.5/CWEB/
, so that the C++
compiler is called using the -frepo
option.
The manual Using and Porting the GNU Compiler
Collection explains this as follows:
"Compile your template-using code with-frepo
. The compiler will generate files with the extension.rpo
listing all of the template instantiations used in the corresponding object files which could be instantiated there; the link wrapper,collect2
, will then update the.rpo
files to tell the compiler where to place those instantiations and rebuild any affected object files. The link-time overhead is negligible after the first pass, as the compiler will continue to place the instantiations in the same files."1
The first time the executable 3dldf
is built, the files that use
the template functions are recompiled one or more times, and the linker
is also called several times. This doesn't happen anymore, once the
.rpo
files exist.
Template instantiation differs from compiler to compiler, so using template functions will tend to make 3DLDF less portable. I am no longer able to compile it on the DECalpha Personal Workstation I had been using with the DEC C++ compiler. See Ports, for more information.