C++ std::is_是否对代码的性能有影响?

C++ std::is_是否对代码的性能有影响?,c++,templates,performance-testing,C++,Templates,Performance Testing,是否相同对代码性能有任何影响?我在代码中多次使用它来检查是否必须使用std::less或std::greater,并根据它们检索特定值。在我的例子中,我的测试是否足以证明std::Is_same不会真正影响代码的性能 代码要复杂得多,我必须使用模板。我尽可能地模仿使用的地方 我使用-O3编译器选项编译并运行代码 #包括 #包括 #包括 使用名称空间std::chrono; 使用名称空间std; 模板 int returnVal(T比较){ 向量v={1,2,3,4}; if(std::is_s

是否相同
对代码性能有任何影响?我在代码中多次使用它来检查是否必须使用
std::less
std::greater
,并根据它们检索特定值。在我的例子中,我的测试是否足以证明std::Is_same不会真正影响代码的性能

代码要复杂得多,我必须使用模板。我尽可能地模仿使用
的地方

我使用
-O3
编译器选项编译并运行代码


#包括
#包括
#包括
使用名称空间std::chrono;
使用名称空间std;
模板
int returnVal(T比较){
向量v={1,2,3,4};
if(std::is_same::value){
返回标准::min(v[0],v[1],比较);
}否则{
返回标准::min(v[2],v[3],比较);
}
}
int returnValNoTemplate(布尔b){
向量v={1,2,3,4};
如果(b==true){
返回标准::min(v[0],v[1]);
}否则{
返回标准::min(v[2],v[3]);
}
}
int main()
{   
对于(int i=0;i<10;i++){
自动启动=高分辨率时钟::现在();
对于(int i=0;i<100000;++i){
intx=returnVal(std::greater());
}
自动停止=高分辨率时钟::现在();
自动持续时间=持续时间(停止-启动);

coutstd:is_same是一个编译时检查,它使用两个不同的模板封装实现。一个使用1类型,一个使用2类型

std::is_same<T, T> //If the compiler resolves to this it is the same type;
std::is_same<T, U> //If the compiler resolves to this it is 2 types;
std::is_same//如果编译器解析为该类型,则它是相同的类型;
std::is_same//如果编译器解析为该类型,则为2种类型;

该实现返回一个类型,然后将其转换为bool,该类型将解析为true或false,并生成一条路径供代码遵循。

如果是这样,我会感到惊讶。我一直假设这些检查发生在编译时,并且生成函数来处理每个类型在测试性能时est打开编译器优化后的代码生成(也称为“发布生成”)。大多数编译器的默认设置是进行未优化(也称为“调试”)构建。未优化的构建是出了名的缓慢,并且经常出现在优化的构建完全消除的地方。不要对调试构建进行基准测试,这是毫无意义的,根本不能反映最终版本的真实性能。理论上,模板版本可以执行得更好,因为
std::is_same
在编译时得到解决。因为'如果将一个常量值传递给另一个版本,那么在这种情况下,我希望编译器为这两个版本生成相同的程序集。尽管如此,我怀疑这两种方式的差异几乎都无法检测。
std::is_same
是一个编译时常量,就像您编写了
true
false
来代替它一样。因此,性能特征将与使用literal
true
false
值相同——编译器肯定会消除条件分支和false分支(即使使用
-O0
,gcc和clang也会这样做)。交换测试顺序可能会更改结果too@SergeyA我试图进一步澄清。
std::is_same<T, T> //If the compiler resolves to this it is the same type;
std::is_same<T, U> //If the compiler resolves to this it is 2 types;