静态方法节省内存?(非托管代码)

yon*_*oni 3 c++ memory static unmanaged

关于托管代码中的静态方法这个问题之后,如果那里的答案与像c ++这样的非托管代码相关,我会感兴趣.

我制作了数千个实例,我的问题主要是关于静态方法.这种方法比常规方法节省内存吗?

谢谢,抱歉我的英语不好.

Luc*_*ore 9

所有方法都需要将二进制代码放在内存中才能运行.可执行代码staticnon-static方法(大部分)是相同的.

两种类型的方法在内存中只需要一个位置,因此它们不会与类的每个实例一起复制.

我们现在来看看一些代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

只有很小的差别,例如将this指针推到堆栈上以获得非静态函数,但它们很小,可能一个不错的优化器会进一步减少差异.

关于是否使用静态函数的决定应该严格地由设计驱动,而不是由内存驱动.