- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 this question about static methods in managed code 之后,如果那里的答案与非托管代码(如 C++)相关,我很感兴趣。
我创建了数千个实例,我的问题主要是关于静态方法的。与常规方法相比,此方法是否节省内存?
谢谢,抱歉我的英语不好。
最佳答案
所有方法都需要将其二进制代码保存在内存中才能运行。 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
指针压入非静态函数的堆栈,但它们是微小的,并且可能一个体面的优化器会进一步减少差异。
关于是否使用静态函数的决定应该严格由设计驱动,而不是内存驱动。
关于c++ - 静态方法节省内存? (非托管代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8353842/
我试图找出在将数据传输到设备之前将数据复制到固定内存是否有意义,因为我对输入数据的分配没有影响(它是一个库)。 std::vector idata(WORK_SIZE); int *idata_ali
model.save() 让我很困惑。 示例。我将我的 mongoose.model(mongoose.schema) 移动到单独的 model.js 文件中。当我使用这种方法创建模型时,以下问题困扰
我正在用 Java Swing 制作模拟时钟。要计算我需要的时钟指针角度: 我可以通过 System.currentTimeMillis() 获得的以毫秒为单位的 UTC 时间 时区偏移 TimeZo
编辑 我的应用程序中有声音,该声音在应用程序启动时开始播放。此外,我还有两种播放和停止声音的方法: -(void)playBgMusic { NSString *path = [[NSBundle m
所以我的应用有 1 个 Activity 和 4 个 fragment ,其中一个有 Chronometer 来显示经过了多少时间。 它工作正常,但我有一个问题,每次我移动到另一个 fragment
我是 FireDAC 新手,遇到问题。我想在Delphi XE7中使用FireDAC读写SQLite数据库。我尝试的大部分方法都有效,但我在将 TTime 保存到 SQLite DB 时遇到问题。 这
这是我使用基本 Node.js 服务器创建的示例站点。我能够成功发布、创建给定架构的用户,然后“保存”到数据库;但是,保存不会返回用户对象,并且在我的实际数据库中找不到。连接也返回成功。 main.j
我有一台配备 2 Gb Nvidia GPU 的 Mac Book Pro。我正在尝试利用我所有的 GPU 内存进行计算(python 代码)。如果我绕过 GUI 界面并仅通过命令行访问我的机器,我可
我希望使用 Powerpoint 创建一种测验,我想保存用户提供的输入。 例如:如果我问这个问题:你最喜欢什么颜色?当他们回答问题并单击下一步按钮时,我想保存文本框的值并将其附加到输出文件中。 我已经
我是一名优秀的程序员,十分优秀!