提问人:SirVivor 提问时间:5/22/2023 最后编辑:SirVivor 更新时间:5/22/2023 访问量:89
如何避免每次编译项目时都重新编译特定的模板函数?[复制]
How can I avoid recompiling a specific template function each time I compile my project? [duplicate]
问:
假设我有一个带有模板的文件foo.hpp
template<int a>
void foo()
{
// Complex function
}
我在我的:main.cpp
#include "foo.hpp"
int main()
{
// quickly compiled code
// ...
foo<3>();
// more quickly compiled code
}
现在每次我修改后编译我的项目,都需要重新编译,即使它没有改变。
在我的情况下,绝大多数编译时间都花在了编译上,因此避免这种情况至关重要。main.cpp
foo<3>()
foo<3>()
我想分两步编译我的项目:
- 编译。这需要很长时间,但我只做一次。
foo<3>()
- 编译。这现在很快,因为已经编译好了。
main.cpp
foo<3>()
如何实现此行为?我尝试在不同的文件中进行显式实例化并首先编译它,但仍然需要相同的时间来编译。main.cpp
感谢您的帮助!
编辑: 澄清了我使用显式实例化尝试的内容:
创建一个新文件 :precompiled.cpp
#include "foo.hpp"
template void foo<3>();
然后尝试先用编译,然后使用 .
但这在第 2 步中再次实例化,我想避免这种情况。g++ -c precompiled.cpp
main.cpp
g++ precompiled.o main.cpp
foo<3>()
答:
如果使用函数,则无法避免实例化。请改用以下方法:foo<3>
template<int a>
struct foo
{
void operator()() {
//complex code here
}
};
使用以下代码使文件命名为bar.hpp
#include "foo.hpp"
struct foo_3 {
static foo<3> fooinst = foo<3>();
void operator()() {
foo_3::fooinst();
}
};
然后使用(允许你预编译它返回一个文件。虽然我很困惑你为什么坚持使用模板。bar.hpp
.gch
模板需要在标头 () 中定义,并在编译单元 () 中实例化。与常规类不同,您不能在标头中声明函数并在编译单元中定义它,这将导致您期望的编译行为:仅在函数的实例化更改时重新编译函数。.hpp
.cpp
我建议将对模板的所有调用包装在一个单独的文件中,并将这些调用包装在将从中调用的函数中。这样,您就可以在不重新编译的情况下修改 .但是,如果您更改在另一个单元中的使用方式,则将重新编译。.cpp
main.cpp
main.cpp
foo
foo
例::foo3.cpp
#include "foo.hpp"
void foo3() {
foo<3>();
}
foo3.hpp
:
#pragma once
void foo3();
main.cpp
:
#include "foo3.hpp"
int main()
{
// quickly compiled code
// ...
foo3();
// more quickly compiled code
}
标头中缺少 .extern template void foo<3>();
foo
评论
extern
上一个:跨多个库的显式实例化
下一个:使用函数模板进行函数重载
评论
foo<3>
foo<42>
main
foo()
main
foo<3>()
main
foo<3>()