静态
和非静态
方法的可执行代码(大部分)相同。class A
{
public:
void foo();
static void goo();
};
void A::foo()
{
004113D0 push ebp
004113D1 mov ebp,esp
004113D3 sub esp,0CCh
004113D9 push ebx
004113DA push esi
004113DB push edi
004113DC push ecx
004113DD lea edi,[ebp-0CCh]
004113E3 mov ecx,33h
004113E8 mov eax,0CCCCCCCCh
004113ED rep stos dword ptr es:[edi]
004113EF pop ecx
004113F0 mov dword ptr [ebp-8],ecx
}
004113F3 pop edi
004113F4 pop esi
004113F5 pop ebx
004113F6 mov esp,ebp
004113F8 pop ebp
004113F9 ret
void A::goo()
{
00411530 push ebp
00411531 mov ebp,esp
00411533 sub esp,0C0h
00411539 push ebx
0041153A push esi
0041153B push edi
0041153C lea edi,[ebp-0C0h]
00411542 mov ecx,30h
00411547 mov eax,0CCCCCCCCh
0041154C rep stos dword ptr es:[edi]
}
0041154E pop edi
0041154F pop esi
00411550 pop ebx
00411551 mov esp,ebp
00411553 pop ebp
00411554 ret
int main()
{
A a;
a.foo();
0041141E lea ecx,[a]
00411421 call foo (4111E5h)
a.goo();
00411426 call A::goo (4111EAh)
return 0;
}
只有一些小的差异,例如将this
指针推入非静态函数的堆栈中,但它们是很小的,一个不错的优化器可能会进一步减少这些差异。
关于是否使用静态函数的决定应该严格基于设计考虑,而不是内存驱动。
静态方法本质上只是自由函数,因此它们的内存占用量是相同的。成员函数有一个额外的参数,所以增加的内存略大,但关注这些东西是没有意义的。
函数占用的内存量是每个类而不是每个实例。你不应该担心。
简短回答:不行。一个方法是一个带有隐含第一个参数等于其类的函数,而静态函数则缺少这个第一个参数。实际上,情况与垃圾收集语言中的情况完全相同,因此对于其他问题的答案也完全适用。