C++ 自动选择“按值传递”和“按引用传递”

C++ 自动选择“按值传递”和“按引用传递”,c++,c++11,template-meta-programming,C++,C++11,Template Meta Programming,我有一个带有模板参数T的类。该类的某些函数获得一个类型为T的参数。为了实现最大速度,如果T是内置类型,我希望通过值传递它,在其他情况下,则通过常量引用传递它。我知道这是可以实现的,有一些模板元编程,但是我在寻找标准C++库中的一些特性(C++ 11也欢迎),它支持什么(编译时),或者更容易实现。 我想写一个这样的代码,其中get_type是T,如果T是内置类型,get_type是const T&如果T是其他类型: template <typename T> void foo(get_

我有一个带有模板参数T的类。该类的某些函数获得一个类型为T的参数。为了实现最大速度,如果T是内置类型,我希望通过值传递它,在其他情况下,则通过常量引用传递它。我知道这是可以实现的,有一些模板元编程,但是我在寻找标准C++库中的一些特性(C++ 11也欢迎),它支持什么(编译时),或者更容易实现。 我想写一个这样的代码,其中get_type是T,如果T是内置类型,get_type是const T&如果T是其他类型:

template <typename T> void foo(get_type<T> a);
模板无效foo(获取类型a);

S.S:我知道洛基()有它的功能,但我不想让我的代码依赖于外部库。

< P>在C++ C++库中没有任何东西,但是有什么你想做的。

< P>标准C++库中没有任何东西,但是有一种方法可以满足您的需要。

我认为执行速度并不取决于类型是内置类型这一事实。从汇编程序输出的编译代码来看,我认为数据可以通过cpu寄存器而不是堆栈上的副本传递是很重要的。因此,这取决于cpu体系结构、编译器本身以及函数所需的参数数量。举个例子:如果你有一个像avr一样的8位cpu,并且你传递了一个32位的int值,编译器可以使用4!寄存器,或者它可以使用堆栈帧和指向堆栈帧的指针

根据我的经验,唯一有助于自动加速的事实是查看必须传递给函数的数据量。如果涉及多个寄存器,则传递引用可能很有用。但它仍然取决于体系结构、编译器和编译器设置

对于第一次尝试,您可以尝试简单地获取参数的大小作为标准。如果大小大于n个cpu寄存器,则可以专门化模板以进行引用传递。这可以通过使用SFINAE和std::enable_if(sizeof(T)>x)简单地完成

作为第二次机会,您可以看看std::is_xxx。有很多预定义的模板,比如std::is_basical。您可以组合std::is_xxx中的任意一个。见:
我认为执行速度并不取决于类型是内置类型这一事实。从汇编程序输出的编译代码来看,我认为数据可以通过cpu寄存器而不是堆栈上的副本传递是很重要的。因此,这取决于cpu体系结构、编译器本身以及函数所需的参数数量。举个例子:如果你有一个像avr一样的8位cpu,并且你传递了一个32位的int值,编译器可以使用4!寄存器,或者它可以使用堆栈帧和指向堆栈帧的指针

根据我的经验,唯一有助于自动加速的事实是查看必须传递给函数的数据量。如果涉及多个寄存器,则传递引用可能很有用。但它仍然取决于体系结构、编译器和编译器设置

对于第一次尝试,您可以尝试简单地获取参数的大小作为标准。如果大小大于n个cpu寄存器,则可以专门化模板以进行引用传递。这可以通过使用SFINAE和std::enable_if(sizeof(T)>x)简单地完成

作为第二次机会,您可以看看std::is_xxx。有很多预定义的模板,比如std::is_basical。您可以组合std::is_xxx中的任意一个。见:

不是完全相同的问题,但答案也回答了我的问题。谢谢你的链接。不是完全相同的问题,但答案也回答了我的问题。谢谢你的链接。我第一次尝试使用这段代码:
模板使用参数\u type=std::conditional我将此代码用作第一次尝试:
使用参数_type=std::conditional的模板