gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:40:52 36 4
gpt4 key购买 nike

this question about static methods in managed code 之后,如果那里的答案与非托管代码(如 C++)相关,我很感兴趣。

我创建了数千个实例,我的问题主要是关于静态方法的。与常规方法相比,此方法是否节省内存?

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

最佳答案

所有方法都需要将其二进制代码保存在内存中才能运行。 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;
}

只有微小的差异,例如将 this 指针压入非静态函数的堆栈,但它们是微小的,并且可能一个体面的优化器会进一步减少差异。

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

关于c++ - 静态方法节省内存? (非托管代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8353842/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com