gpt4 book ai didi

c++ - 在我的例子中是指针还是值?

转载 作者:行者123 更新时间:2023-11-28 01:01:50 24 4
gpt4 key购买 nike

bool example1()
{
long a;
a = 0;
cout << a;
a = 1;
cout << a;
a = 2;
cout << a;
//and again...again until
a = 1000000;
cout << a+1;
return true;
}
bool example2()
{
long* a = new long;//sorry for the misstake
*a = 0;
cout << *a;
*a = 1;
cout << *a;
*a = 2;
cout << *a;
//and again...again until
*a = 1000000;
cout << *a + 1;
return true;
}

注意example2()中我没有删除a,只是新手提问:
1. 两个函数在执行时,哪个占用内存多?
2. 函数返回后,哪一个使整个程序占用更多的内存?
感谢您的帮助!

更新:只需将 long* a; 替换为 long* a = new long;
更新 2:为了避免我们没有对 a 做任何事情的情况,我每次都计算值。

最佳答案

原始答案

视情况而定,同时不会有任何差异。

第一个程序将在堆栈上消耗 sizeof(long) 字节,第二个程序将消耗 sizeof(long*)。通常 long*至少与 long 一样大,因此您可以说第二个程序可能使用更多内存(取决于编译器和架构)。

另一方面,堆栈内存是按照操作系统内存页粒度(4KB 是一个很好的估计)分配的,因此几乎可以保证两个程序为堆栈使用相同数量的内存页。从这个意义上说,从观察系统的人的角度来看,内存使用将是相同的。

但它变得更好了:编译器可以自由决定(取决于设置)你实际上没有对这些局部变量做任何事情,所以它可能决定在这两种情况下根本不分配任何内存。

最后你必须回答“指针指向什么”的问题(正如其他人所说,程序当前编写的方式几乎肯定会由于在运行时访问无效内存而崩溃)。

假设它没有(假设指针被初始化为一个有效的内存地址),你会将该内存算作“已使用”吗?

更新(long* a = new long edit):

现在我们知道指针将是有效的,堆内存将分配一个long(但不会释放!)。堆栈分配与以前相同,但现在 example2 还将在堆上至少使用 sizeof(long) 字节(很可能会使用更多,但你不知道有多少,因为这取决于所使用的堆分配器,而这又取决于编译器设置等)。

现在从观察系统的人的角度来看,这两个程序仍然不太可能表现出不同的内存占用(因为堆分配器很可能会满足 new long 的请求 example2 已经从操作系统接收到的页面中的内存),但是进程地址空间中可用的可用内存肯定会减少。所以从这个意义上说,example2 会使用更多的内存。还有多少?取决于分配的开销,如前所述,这是未知的。

最后,由于 example2 在退出之前没有释放堆内存(即存在内存泄漏),即使在 example1 返回后它仍将继续使用堆内存> 不会。

关于c++ - 在我的例子中是指针还是值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365144/

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