C++11 为什么在添加之前要将浮点转换为int?

C++11 为什么在添加之前要将浮点转换为int?,c++11,gcc,x86,C++11,Gcc,X86,当我看到一些奇怪的东西时,我正在胡闹。考虑以下功能: #include <algorithm> #include <cstdlib> #include <functional> float dot(float src1[], float src2[], int size) { float* vecmul = static_cast<float*>(malloc(size * sizeof (float))); float dotprod

当我看到一些奇怪的东西时,我正在胡闹。考虑以下功能:

#include <algorithm>
#include <cstdlib>
#include <functional>

float dot(float src1[], float src2[], int size) {
  float* vecmul = static_cast<float*>(malloc(size * sizeof (float)));
  float dotprod = 0;
  std::transform(src1, src1+size, src2, vecmul, std::multiplies<float>());
  dotprod = std::accumulate(vecmul, vecmul+size, 0);
  free(vecmul);
  return dotprod;
}

我很好奇为什么我们要进行浮点到整数的转换,然后进行整数加法,然后再进行转换(带星号的线条)。为什么这比直接的fadd快?

std::accumulate
的累加器类型由其第三个参数确定
0
是一个
int
,因此
std::累加(vecmul,vecmul+size,0)
将每个中间加法的结果转换为
int
,最后返回
int

您需要
std::累加(vecmul,vecmul+size,0.0f)
使蓄能器成为浮动的

dot(float*, float*, int):
// load args, do multiplication from std::transform (with mulss)
.L22:
    pxor    %xmm0, %xmm0
    addq    $4, %rcx
    cvtsi2ss    %edx, %xmm0 *
    addss   -4(%rcx), %xmm0 *
    cmpq    %rcx, %rsi      *
    cvttss2si   %xmm0, %edx *
    jne .L22              
    pxor    %xmm0, %xmm0    
    cvtsi2ss    %edx, %xmm0 
.L4:
// pop arguments, free, etc.