自动选择传递值和传递参考

时间:2013-09-09 09:09:15

标签: c++ c++11 template-meta-programming

我有一个带有模板参数T的类。类的一些函数得到一个类型为T的参数。为了达到最大速度,如果T是内置类型并且通过const传递它,我想通过值传递它在其他情况下参考。我知道这可以通过一些模板元编程来实现,但我在标准C ++库中寻找某种特性(C ++ 11也受欢迎)支持它(在编译时),或者更容易实现

我想编写这样的代码,其中get_type是T,如果T是内置类型,则get_type是const T&如果T是其他任何东西:

template <typename T> void foo(get_type<T> a);

P.S。:我知道Loki(http://loki-lib.sourceforge.net/)有一个函数,但我不想让我的代码依赖于外部库。

2 个答案:

答案 0 :(得分:2)

标准C ++库中没有任何内容,但有boost::call_traits::param_type可以满足您的需求。

答案 1 :(得分:1)

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

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

对于第一次尝试,您可以尝试简单地将参数的大小作为条件。如果大小大于n cpu寄存器,您可以专门化模板以供参考传递。这可以通过使用SFINAE和std :: enable_if(sizeof(T)&gt; x)来完成

作为第二次机会,您可以查看std :: is_xxx。有许多预定义的模板,例如std :: is_fundamental。您可以组合任何std :: is_xxx。看到: http://en.cppreference.com/w/cpp/header/type_traits