Статические методы экономят память? (неуправляемый код) - PullRequest
3 голосов
/ 02 декабря 2011

Вслед за этот вопрос о статических методах в управляемом коде , мне интересно, если ответы там имеют отношение к неуправляемому коду, например c ++.

Я делаю тысячи экземпляров, и мой вопрос в основном о статических методах. Сохраняют ли эти методы память по сравнению с обычными методами?

спасибо, и извините за мой плохой английский.

Ответы [ 4 ]

9 голосов
/ 02 декабря 2011

Все методы требуют, чтобы их двоичный код был в памяти для запуска.Исполняемый код для методов static и non-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;
}

Есть только незначительные различия, такие как перемещение указателя this в стек для нестатической функции, но они незначительны, и, вероятно, приличный оптимизатор уменьшит различия еще больше.

Решение о том, использовать статические функции или нет, должно быть строго ориентировано на дизайн, а не на память.

4 голосов
/ 02 декабря 2011

Статические методы - это, по сути, просто свободные функции, поэтому их объем памяти остается тем же. Функции-члены имеют дополнительный параметр, поэтому добавленная память немного больше, хотя заботиться о таких вещах бессмысленно.

Объем памяти, занимаемый функцией для каждого класса, а не для каждого экземпляра. Вы не должны быть обеспокоены.

2 голосов
/ 02 декабря 2011

Краткий ответ: Нет. Метод - это функция с неявным первым аргументом, равным его классу, и статическая функция не имеет этого первого аргумента. На самом деле ситуация такая же, как и в языках с сборкой мусора, поэтому ответы на другой вопрос применимы полностью.

0 голосов
/ 02 декабря 2011

Разница между статическим и экземпляром метода является только первым параметром.В C ++ все методы экземпляра компилируются в обычную функцию с замещенным первым параметром с именем this , который является указателем на объект, для которого был вызван метод.

На большинстве архитектур это будет 8-байтовое значение, поэтому оно не имеет особого значения, если вы не занимаетесь кодированием встроенных систем с очень строгими ресурсами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...