在我的情况下指针或价值?

时间:2011-12-03 03:01:09

标签: c++ pointers

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.功能返回后,哪一个使整个程序使用更多的记忆? 谢谢你的帮助!

更新:只需回复长* a; long * a = new long;
更新2:为了避免我们没有对 a 做任何事情,我每次都会输入值。

4 个答案:

答案 0 :(得分:2)

原始答案

这取决于同时没有区别。

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

另一方面,堆栈存储器分配有OS存储器页面粒度(4KB是一个很好的估计),因此两个程序几乎保证使用相同数量的存储器页面用于堆栈。从这个意义上讲,从观察系统的人的角度来看,内存使用情况将是相同的。

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

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

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

更新(long* a = new long编辑):

现在我们知道指针有效,堆内存将分配给long(但未发布!)。堆栈分配与以前相同,但现在example2也将在堆上使用至少sizeof(long)个字节(很可能它会使用更多,但你不知道多少因为这取决于正在使用的堆分配器,而后者依赖于编译器设置等。)

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

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

答案 1 :(得分:1)

只有一种方法可以通过测量来了解。由于您实际上从未使用过您指定的任何值,因此编译器可以在“as-if规则”下简单地将两个函数优化为:

bool example1()
{
    return true;
}
bool example2()
{
    return true;
}

根据C ++规则,这将是对代码的完全有效解释。由您来编译和测量它以查看实际发生的情况。


叹息,对问题的编辑对上述情况有所不同。主要观点仍然存在:除非你测量它,否则你无法知道。现在,这两个功能都可以优化为:

bool example1()
{
    cout << 0;
    cout << 1;
    cout << 2;
    //and again...again until
    cout << 1000001;
    return true;
}
bool example2()
{
    cout << 0;
    cout << 1;
    cout << 2;
    //and again...again until
    cout << 1000001;
    return true;
}

答案 2 :(得分:0)

example2()永远不会为指针a引用的值分配内存。如果确实如此,则会占用更多的内存,因为它需要long所需的空间以及指向它的指针的空间。

此外,无论您为a分配多少次,都不会使用更多内存。

答案 3 :(得分:0)

示例2存在不为指针分配内存的问题。指针a最初具有未知值,使其指向内存中的某处。为此指针指定值会破坏某处的内容。

两个示例都使用相同数量的内存。 (这是4个字节。)