0

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

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

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

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

4

2 回答 2

2

标准 C++ 库中没有任何内容,但有boost::call_traits::param_type你想要的。

于 2013-09-09T09:14:27.107 回答
1

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

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

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

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

于 2013-09-09T09:51:48.620 回答