C++ 我可以使用一段代码作为C++;模板?(不添加函数调用)
我在一个函数上有几个对时间敏感的变体,所以我希望编写一个模板,只修改几行不同的代码。由于存在速度压力,我试图避免额外的函数调用 在前面的预处理器中,我会写:C++ 我可以使用一段代码作为C++;模板?(不添加函数调用),c++,templates,preprocessor,C++,Templates,Preprocessor,我在一个函数上有几个对时间敏感的变体,所以我希望编写一个模板,只修改几行不同的代码。由于存在速度压力,我试图避免额外的函数调用 在前面的预处理器中,我会写: // code.inl void FUNC_NAME { a = 1; BIT_OF_CODE b = 2; } // program.cpp #define FUNC_NAME Func1 #define BIT_OF_CODE c = 3; #include "code.inl" #unde
// code.inl
void FUNC_NAME
{
a = 1;
BIT_OF_CODE
b = 2;
}
// program.cpp
#define FUNC_NAME Func1
#define BIT_OF_CODE c = 3;
#include "code.inl"
#undef BIT_OF_CODE
#define FUNC_NAME Func2
#define BIT_OF_CODE c = 999;
#include "code.inl"
为避免重复两个函数的样板部分:
void Func1
{
a = 1; // Common declarations and processing
c = 3;
b = 2; // More common processing
}
void Func2
{
a = 1;
c = 999; // Switched out code uses lots of variables in scope
b = 2;
}
我会考虑内联函数——但理想情况下,我会有一个像lambda这样的东西,它可以使用所有的局部变量(而在不需要更多函数调用的情况下进行优化)。 模板参数是否有一些技巧可以让我简单地插入一些代码?或者这仍然是预处理器的工作
我喜欢模板方法,好像我有更多的变化点,可能的函数数量大幅增加,我希望它们都单独编译和优化。为什么不:#include <stdio.h>
int a, b, c;
template <int N>
void func(){
a = 1;
if(N==1){
c = 3;
#include "code1.inl"
}else if(N==2){
c = 999;
#include "code2.inl"
}
b = 2;
}
int main(){
printf("a=%d;b=%d;c=%d\n", a, b, c);
func<1>();
printf("a=%d;b=%d;c=%d\n", a, b, c);
func<2>();
printf("a=%d;b=%d;c=%d\n", a, b, c);
func<3>();
printf("a=%d;b=%d;c=%d\n", a, b, c);
return 0;
}
检查:
如果您使用gcc-O0编译,您可以在中看到带有“nm”的函数
但是,如果使用-O1编译它,您就看不到它们了,因此它们被优化了。
如果constexpr
可以方便地实现这一点,也许可以使用非类型模板参数?除了宏解决方案,您还可以显示您希望避免编写的手写代码吗?通过引用捕获的lambda应该由任何好的编译器内联而没有跟踪。您是否有证据表明调用lambda仍然存在开销?请记住,代码的可维护性也很重要。宏总是对代码的可维护性产生负面影响。代码的可维护性和性能在这里都很重要。内联线和lambda确实有助于简化代码,我将尝试使用它们进行一些性能测试,但为了避免其他类似样板文件的变量初始化,我喜欢答案中的模板方法。我非常想要一个反向的lambda,它不是捕获变量,而是将变量添加到函数的范围中,这样我就可以用一行代码为不同的代码变体创建一个有用的工作环境。(在本例中,不同的图像采样样式和大量3D画笔变化-太多样板!)这是一个很好的处理方法-意味着我可以访问范围中的所有变量,而无需将它们来回传递给内联函数或lambda,对于函数中更简单的更改,我可以只在函数中编写变体,而不需要#include。
a=0;b=0;c=0
a=1;b=2;c=3
a=1;b=2;c=999
a=1;b=2;c=999
00000000000011fb W _Z4funcILi1EEvv
0000000000001224 W _Z4funcILi2EEvv
000000000000124d W _Z4funcILi3EEvv