c++ - 如何协调将 header /源代码与模板分离的 C++ 习惯用法?

标签 c++ templates header

我有点想知道这个模板业务。

在 C 和 C++ 中,将声明放在头文件中并将定义放在源文件中是很常见的,并且将两者完全分开。然而,就模板而言,这似乎是不可能的(以任何好的方式),而且众所周知,模板是一个很棒的工具。

此外,Boost 主要是标题,所以这是一个真正的问题。在 C++ 中分离 header 和源代码仍然是一个好主意,还是我不应该严重依赖模板?

最佳答案

实例化模板在编译时是昂贵的,但在运行时实际上是免费的。基本上,每次使用新模板类型时,编译器都必须为该新类型生成代码,这就是代码位于 header 中的原因,以便编译器稍后可以访问代码。

将所有代码放在 .cpp 中可以让编译器只编译该代码一次,从而大大加快编译速度。理论上,您可以将所有代码都写在头文件中,它可以正常工作,但是编译非常大的项目需要很长时间。此外,只要您在任何地方更改一行,您就必须重新构建所有内容。

现在你可能会问,STL 和 BOOST 怎么没那么慢?这就是预编译头文件的用武之地。 PCH 让编译器只做一次最昂贵的工作。这适用于不会像库那样经常更改的代码,但是对于更改很多的代码,它的效果完全无效,因为您每次都必须重新编译整套预编译头文件。编译器还使用了一些技巧来避免在每个编译单元中重新编译所有模板代码。

还请注意,C++0x 将引入显式机制来更好地控制模板实例化。您将能够显式实例化模板,最重要的是,可以防止在某些编译单元中实例化。但是,大多数编译器已经在我们不知情的情况下完成了大部分工作。

因此,经验法则是,在您的 .cpp 中放置尽可能多的代码(并包含指令)。如果你不能,那么,你不能。

我的建议是:不要仅仅为了它而设计模板。如果您必须使用模板,请小心并注意您实际上是在编译速度和模板将带来的可用性之间进行选择。

关于c++ - 如何协调将 header /源代码与模板分离的 C++ 习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4950084/

相关文章:

templates - Jade 认为 mixin 是未定义的,但事实并非如此

java - 是否有可能 - 模板化此方法?

c++ - 如何在 C++ 中创建带有自定义比较器的 std::set?

c++ - 寻找插入 vector 的最佳位置

c++ - Qt:无法使用 QProcess 启动 Windows 控制台

header - Varnish - 生成 http header 溢出

c++ - Ubuntu 8.1 上的 g++-4.1 或其他软件无法找到 size_t

c++ - 如何从双向迭代器中减去 1

c++ - 具有原始类型的 C++ 模板

PHP header 重定向循环