C ++编译如何处理共享库和模板

XYZ

我曾经读过某个地方,C ++本质上会根据编译时的使用情况枚举所有可能的模板类型,因此模板的概念在运行时不存在。看来这也是模板编译所接受的答案

我的问题是,如果是这种情况,那么在一切都已编译并完成后,STL如何处理自定义类型?这可以更广泛地应用于使用模板编译的任何自定义库。

(我本可以在答案的注释中提出这个问题,但是我没有足够的观点)

Angew不再为SO感到骄傲

如果库要提供其客户端可以用任意类型实例化的模板,则它必须在头文件中提供模板的完整定义。这就是为什么很多C ++库(包括大多数Boost)都是仅标头的原因。然后,编译器可以访问模板的定义,并可以使用客户端作为模板参数提供的任何类型/值实例化它。

有关该主题的详细处理,请参阅堆栈溢出问题。为什么只能在头文件中实现模板?


请注意,这仅在如我所说的模板适用于任意类型的情况下适用。如果实例化集受到限制并且可以在构建共享库时确定,则该库可以为其想要支持的模板参数的所有组合创建所有模板的显式实例化。然后,不必公开模板的定义,但是当然,不可能在客户端代码中实例化具有不同类型的模板。

例如,有一些几何库将它们的定义作为模板提供,以便它们可以同时使用它们floatdouble表示浮点数,但不公开模板定义。他们只是使用float预先实例化了所有代码double然后,客户可以使用这些实例化,但不能将其用于exmaplelong doubleMyCustomFloat

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C#编译器和虚拟机中如何处理lambda表达式?

我应该如何处理Objective-C库中的日志?

C#编译器如何处理重载显式强制转换运算符?

C编译器如何处理位域?

C ++编译器(或链接器)如何知道如何处理cpp和标头类文件?

如何使C ++(共享)库与clang和GCC兼容?

C ++ ABI如何处理RVO和NRVO?

如何处理!=和|| 在C#中

C ++ / g ++:在这种情况下,编译器如何处理内存分配?

一遍C编译器如何处理标签?

C ++的编译时/运行时选项和参数如何处理?

使用CMake和C ++处理共享库依赖关系

如何从静态C和C ++库创建共享C库?

用C ++文件编译C共享库

C#和泛型:如何处理基于类型的处理?

如何使用CMake在Android构建上编译和共享两个C ++库

C编译器如何处理枚举?

C ++多线程-如何处理对共享变量的写入

编译器如何编译模板和类型检查?(C ++)

C编译器如何处理无符号和有符号整数?为什么无符号和有符号算术运算的汇编代码相同?

scanf如何处理字符串和整数?C

分布式dll和c ++对象-一些库如何处理此问题?

C ++在编译阶段如何处理未知大小的数组分配

C ++如何处理函数中指针和引用的更改?

使用C ++ 11共享库编译共享库(旧标准)

C 编译器如何处理使用未初始化的变量?

如何处理具有不同编译标志的分发共享库?

C++ 如何处理与类型转换相关的模板函数

如何处理递归函数和迭代函数中的编译器错误 c2660?