如何解决我可以在C ++模板中使用一些代码作为参数吗? 不添加函数调用
我在一个函数上有几个对时间敏感的变体,所以我希望编写一个模板,并且只改变几行不同的代码。由于存在速度压力,我试图避免额外的函数调用。
以前使用预处理器,我会写:
// 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,c);
func<1>();
printf("a=%d;b=%d;c=%d\n",c);
func<2>();
printf("a=%d;b=%d;c=%d\n",c);
func<3>();
printf("a=%d;b=%d;c=%d\n",c);
return 0;
}
给予:
a=0;b=0;c=0
a=1;b=2;c=3
a=1;b=2;c=999
a=1;b=2;c=999
检查: 如果使用gcc -O0进行编译,则可以看到带有“ nm”的函数
00000000000011fb W _Z4funcILi1EEvv
0000000000001224 W _Z4funcILi2EEvv
000000000000124d W _Z4funcILi3EEvv
但是,如果使用-O1进行编译,则不会再看到它们,因此它们已经过优化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。