最近,我注意到在一个有多个源文件(file1.cpp
,file2.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/