将变量放在更新循环中的方法范围之外或之内

时间:2013-08-13 04:16:28

标签: java c++

这适用于C和JAVA我要求两者。

我有一个更新循环,可能每秒运行几百次。

我担心的主要是内存管理以及会发生什么。

这是一个例子

public methodA(double Delta)
{
    double doubleTest = Delta;
    SomeObject newObject = new Object(Delta);
}

SomeObject newObject = new Object();
double doubleTest;
public methodB(double Delta)
{
    doubleTest = Delta;
    newObject.setUpdate(Delta);
}

现在我在JAVA中知道方法A是以性能为代价的GC,但在C或C ++中究竟发生了什么?在方法范围内声明的变量或对象是否会被破坏?如果是这样哪个循环更好? (我们是否会因第二个循环而失去记忆力?)

是否真的值得为方法更新预先创建对象?如果有的话,性能会有什么影响?

3 个答案:

答案 0 :(得分:1)

1。 - 变量被破坏。

2. - 其次,如果您传入参数,则不需要在方法范围之外。

3。 - 从写作角度来看,将它全部放在一行会更有效率。如果有的话,两者之间的内存占用非常小。

答案 1 :(得分:0)

  1. 方法不是垃圾收集。

  2. 我的代码中没有看到任何循环,所以我对你的要求感到困惑。

  3. 你的两种方法做了很多不同的事情,因此比较它们很困难。首先,编译器现在非常聪明(Java,C和C ++)。除非Object的构造函数有副作用,否则合理的编译器可能会优化掉对methodA的所有调用,因为它什么都不做。

    methodB做的事与methodA完全不同,所以我不确定你为什么要比较这两者。 methodB调用newObject.setUpdate(),假定它有副作用,编译器不会删除它。当然,如果你从未在其他地方实际使用过newObject,编译器仍然可以确定它是不必要的,并优化掉对methodB的所有调用。

  4. 无论如何,你的问题让我感到困惑,因为我不确定你特意想要比较什么。

答案 2 :(得分:0)

  

现在我在JAVA中知道方法A是以GC为代价的   性能,但在C或C ++中究竟发生了什么?做变量或   在方法范围内声明的对象会被破坏吗?如果是这样的话   循环更好? (我们第二次会失去记忆吗?   循环?)

没有方法被垃圾收集的概念,只有引用被垃圾收集。 局部变量范围仅限于为Java和c ++定义的方法/函数。但是在c ++中有一个例外,如果你使用malloc / calloc创建动态数据结构,那么在你没有明确地这样做之前,该变量的内存不会被释放。 C ++中没有垃圾收集器,所以你需要注意动态内存分配并释放内存。这个责任在于C ++中的开发人员,而在Java中,JVM垃圾收集器负责处理它。