C++ 性能取决于我们实现类的方法的位置

C++ 性能取决于我们实现类的方法的位置,c++,class,c++17,C++,Class,C++17,在很大程度上,案例3是执行时间最慢的吗 案例1:类外定义的方法 A类{ INTA,b; 公众: A(int,int); int add(); }; A::A(int A,int b){A=A;b=b;} int A::add(){返回A+b;} 案例2:类中定义的方法 A类{ INTA,b; 公众: A(int A,int b){A=A;b=b;} int add(){返回a+b;} }; 案例3:案例1和案例2的混合 A类{ INTA,b; 公众: A(int A,int b){A=A;b

在很大程度上,案例3是执行时间最慢的吗

案例1:类外定义的方法

A类{
INTA,b;
公众:
A(int,int);
int add();
};
A::A(int A,int b){A=A;b=b;}
int A::add(){返回A+b;}
案例2:类中定义的方法

A类{
INTA,b;
公众:
A(int A,int b){A=A;b=b;}
int add(){返回a+b;}
};
案例3:案例1和案例2的混合

A类{
INTA,b;
公众:
A(int A,int b){A=A;b=b;}
int add();
};
int A::add(){返回A+b;}

它们都是完全相同的,但前提是在定义方法的同一翻译单元中调用这些方法

这里真正重要的不是函数是在类定义内定义还是在类定义外定义。重要的是函数的完整定义在调用该函数时是否对编译器可见。这通常意味着函数的定义必须与调用函数的代码位于同一翻译单元中。直接在类定义本身中定义类的成员函数是实现这一点的一种方法。如果在类定义之外定义成员函数,并将它们放在包含在多个翻译单元中的头文件中,则需要使用
inline
关键字

如果函数的定义在调用这些函数的时候是可见的,编译器可以很容易地内联调用这些函数。例如,考虑到以下情况:

A a(one, two);
int three = a.add();
如果
A::A(int,int)
A::add
的定义可见,那么编译器可以轻松地将该操作简化为两条简单的汇编指令。i、 e:

mov eax, esi
add eax, edx
。请注意,为
main
生成的代码在所有三种情况下都完全相同。编译器可以看到,一旦说了所有的话并做了所有的事情,代码就相当于
three=one+two
,并将其编译成这样。编译器甚至可以在编译时进行计算,并用一个常量替换所有的计算,前提是此时输入已知

但是,如果函数定义不可见,编译器就无法进行任何优化(可能会禁用链接时间优化)。它必须向函数插入
call
s,以便链接器稍后解析。这需要一些额外的开销


那么,我们为什么不把所有的代码都放在头文件中呢?一个原因是函数调用的额外开销非常小。如果函数做了大量的工作,那么函数的运行时很可能会缩短执行函数调用所需的额外时间。强制编译器完成所有这些额外的工作也会增加编译时间


尽管如此,目前流行的仅头库正是因为它们的易用性和可能的性能优势。当您对它们进行测量时,您发现了什么?编译器最终可能会将这三个库优化为相同的精确代码。@eerorika使用
std::chrono
并没有真正的帮助(结果我一直得到0秒)为了知道这3起案件是否会同时执行,我想知道是否有人知道这3起不同的案件implementations@drescherjm这是默认情况下幕后的情况吗?