我正在为拼贴分配工作一个通用库类,并且代码运行尽可能高效非常重要,也就是说,如果我们可以减少if语句,我们应该这样做。
如果数组是基本类型(如double或int),则我需要以下代码来初始化数组。
T b[dim];
if(std::is_fundemental::<T>::value)
{
memset(b, 0, dim*sizeof(T));
}
现在的问题是这个检查是否已经过优化,这样它就不会进行运行时检查,或者我是否需要为基本类型的专门化创建初始化模板?
我将G ++与C ++ 11一起使用,但它应该能够在不检查大多数(最好是所有)编译器的情况下运行。
答案 0 :(得分:6)
标准没有解决优化问题,但我无法想象 一个不会进行这种优化的编译器。但是它 真的很重要:你最多只谈论一两台机器 说明,之后你调用一个功能很多的功能 更多。从形式上讲,除了积分之外,它不起作用 类型。 (并不是说我曾经听说过一台双人机 所有0位都不是0.0。)
但是FWIW:std::uninitialized_fill_n
应该至少同样快,
并且您不需要if
,因为它适用于所有类型。
答案 1 :(得分:4)
使用启用的asm列表编译它,看看编译器在每种情况下做了什么。唯一可以确定将会发生什么的方法。
P.S。 不同的编译器可能产生不同的结果。但我想你已经知道了。
答案 2 :(得分:3)
如果您使用编译时常量来启用代码,您也可以使用专门的模板函数并使用SFINAE来启用模板。这可以保证只编译/链接所需的功能。此功能独立于优化
以下示例为您提供了一个想法:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
void Do( T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
cout << "Is fundamental" << endl;
}
template <typename T>
void Do( T t, typename std::enable_if<std::is_integral<T>::value == false>::type* = 0)
{
cout << "Is not fundamental" << endl;
}
class NonFuncdamental
{} nonFundamental;
int fundamental;
int main()
{
Do( fundamental );
Do( nonFundamental );
return 0;
}