最近,我注意到在一个有多个源文件(file1.cppfile2.cpp,...)的项目中,它可能会影响执行时间,而函数A(将由另一个函数B调用)的定义是在源文件与该函数B是否相同。

在我的情况下,当两者在同一file1.cpp中定义时,函数B占用大约90%的执行时间,而探查器分析不会返回函数A(由B调用)的执行时间。

但是,如果它们是在单独的文件中定义的,则执行时间将增加约150%,并且函数A会花费约65%的时间,而函数B会花费约25%(约90%的时间)。

为什么执行时间增加了?功能定义位置对它们的调用方式有影响吗?我不知道。

在这一点上,我应该说我正在使用优化级别3,因此在两种情况下都应在B中内联函数A。

编辑:我正在使用Linux Ubuntu 14.04,我用g++和以下标志编译:-O3 -pg -ggdb -Wall -Wextra -std=c++11

我也包括A和B儿子,这可以更好地理解。如您所愿,A由另一个C函数从B调用,但是似乎没有问题:

A:

size_t A (const Matrix& P, size_t ID) {
  size_t j(0);
  while (P[j][0]!=ID) {
    ++j;
  }
  return j;
}


B:

Matrix B (const Matrix& P, const Matrix& O, Matrix* pREL, double d, const Vector& f) {`

  size_t length (O.size())      ;
  Matrix oREL ( *pREL ) ;

  for (size_t i(0); i<length; ++i) {
  for (size_t j(0); j<=i; ++j) {
    double fi(f[O[i][0]-1]);
    if (f.size()==1) fi = 0.0;
    if (i!=j)  {
        double gAC, gAD, gBC, gBD, fj(f[O[j][0]-1]);
        if (f.size()==1) fj = 0.0;
        gAC = C(pREL,P,O,i,j,dcol,dcol);
        gAD = C(pREL,P,O,i,j,dcol,scol);
        gBC = C(pREL,P,O,i,j,scol,dcol);
        gBD = C(pREL,P,O,i,j,scol,scol);
        oREL[i][j] = 0.25 * (gAC + gAD + gBC + gBD)
                          * (1 - d*(fi+fj));
    } else if (i==j) oREL[i][i] = 0.5 * ( 1.0+C(pREL,P,O,i,i,dcol,scol) )
                                      * (1.0-2.0*d*fi );
    }
 }

  delete pREL;

  return oREL;
}


C:

coefficient C (Matrix * pREL, const Matrix& P, const Matrix& O,
                    size_t coord1, size_t coord2, unsigned p1, unsigned p2) {
double g;
size_t i, j  ;
i = A(P,O[coord1][p1]);
j = A(P,O[coord2][p2]);
if (i<=j) g = (*pREL)[j][i];
if (i>j ) g = (*pREL)[i][j];

return g;
}

最佳答案

是。编译器只有在内联时知道函数定义时才能内联函数。如果将其放在其他编译单元中,则可能不知道。在您的情况下,我认为编译器正在“思考”:他正在调用此函数,但我不知道它在哪里,因此我进行了普通调用,并让链接器稍后担心。

因此,应该内联的代码通常放在头文件中。

关于c++ - 我应该在哪个源文件中定义一个函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29065999/

10-11 22:46
查看更多