C++ 将int值添加到double时是否有性能优势/劣势?

C++ 将int值添加到double时是否有性能优势/劣势?,c++,C++,给定向量加法: NPNumber NPNumber::plus(const double o) const { vector<double> c; for (double a : values) c.push_back(a + o); return NPNumber(width, c); } NPNumber NPNumber::plus(常数双o)常数{ 载体c; for(双a:值) c、 推回(a+o); 返回编号(宽度,c);

给定向量加法:

  NPNumber NPNumber::plus(const double o) const {
    vector<double> c;
    for (double a : values)
       c.push_back(a + o);

    return NPNumber(width, c);
  }
NPNumber NPNumber::plus(常数双o)常数{
载体c;
for(双a:值)
c、 推回(a+o);
返回编号(宽度,c);
}
当NPNumber包含一个双精度向量(字段值)时,当我只添加一个整数而不是另一个NPNumber时,与转换该整数并使用上述函数相比,是否有性能优势或损失

i、 例如,这在任何体系结构上是否更快/更慢:

  NPNumber NPNumber::plus(const int i) const {
    vector<double> c;
    for (double a : values)
       c.push_back(a + i);

    return NPNumber(width, c);
  }
NPNumber NPNumber::plus(const int i)const{
载体c;
for(双a:值)
c、 推回(a+i);
返回编号(宽度,c);
}

它强烈依赖于编译器,您应该在代码中度量它。在我的机器(32位MinGW/gcc4.9)中快速而简单的观察表明,
+
本身在这两种情况下是相等的,但是积分运算似乎更好一些

添加两个
double

!        double d = 0.2;
fldl   0x409070
fstpl  -0x10(%ebp)

!        double y = 1.0;
fld1   
fstpl  -0x18(%ebp)

!        double z = d + y;
fldl   -0x10(%ebp)
faddl  -0x18(%ebp)
fstpl  -0x20(%ebp)
添加两个
int

!        double d = 0.2;
fldl   0x409070
fstpl  -0x28(%ebp)

!        int y = 1;
movl   $0x1,-0x2c(%ebp)

!        double z = d + y;
fildl  -0x2c(%ebp)
faddl  -0x28(%ebp)
fstpl  -0x38(%ebp)
两者都使用
faddl
进行加法,但编译器在加法之前使用更好的指令加载整数。因此,将一个整数添加到一个double中不会有任何损失(这可能比添加两个double更好)


在你的应用程序中,剖析是找出哪一个更好的最好方法。

< P>另一个要考虑的事情是编译器优化。

浮点单元往往有自己的寄存器。在某些情况下,它们甚至可能比典型的操作数(例如,80位临时实数)具有更高的精度。但是,请参阅注释,因为这可能会有很大的变化

我希望对已经加载到FPU中的值进行操作更便宜,编译器应该知道这一点。因此,它可能会将常量值提升出循环,并将值加载到FPU中,在这种情况下,大向量上的差异可以忽略不计

无论如何,我希望如果在给定的平台上,
int
double
的转换是昂贵的,那么一个值得尊敬的编译器不会重复执行它。因此,我可能要做的是将其作为模板方法,这样您就可以接受常量数据自然来自的任何类型和精度;这允许编译器在任何给定情况下为特定平台“做正确的事情”


话虽如此,编译器的优化策略和平台的特性和性能特征也各不相同,所以如果你想挤出最后一微秒的时间,你应该为你感兴趣的平台做评测。

N.B.
vector c(values.size())
使用
值.size()创建一个向量
默认初始化元素(值
0
),然后
向后推
在它们之后添加其他元素。也许你想用
reserve
来代替?你是对的。这只是另一种方法的愚蠢复制粘贴错误。因为这里对分配不感兴趣,所以我完全删除了它。FPU堆栈是x87体系结构的一个特性,我认为没有任何其他体系结构会受到它的影响。其他FPU,包括x86 SSE,通常使用寄存器。但是结论仍然是相关的:如果结果可以有效地保存在FPU中,
int
double
的转换可以被提升。@MSalters:感谢关于FPU寄存器文件的提示;修正了。哦,FP寄存器通常也没有更高的精度。这也是x87的一个奇怪之处。事实上,一些低端芯片的精度较低(硬件采用浮点运算,双精度运算需要软件)@MSalters:听起来我需要出去看看更多的FPU。:-)