编译器是否在c ++中优化静态值的if语句

时间:2013-05-15 11:23:17

标签: c++ performance optimization c++11

我正在为拼贴分配工作一个通用库类,并且代码运行尽可能高效非常重要,也就是说,如果我们可以减少if语句,我们应该这样做。

如果数组是基本类型(如double或int),则我需要以下代码来初始化数组。

T b[dim];
if(std::is_fundemental::<T>::value) 
{ 
    memset(b, 0, dim*sizeof(T));
}

现在的问题是这个检查是否已经过优化,这样它就不会进行运行时检查,或者我是否需要为基本类型的专门化创建初始化模板?

我将G ++与C ++ 11一起使用,但它应该能够在不检查大多数(最好是所有)编译器的情况下运行。

3 个答案:

答案 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;
}