关于c#:存储在array中的缓存变量=更好的检索性能?

Cache variables stored in array = better performance of retrieval?

考虑C指针并使用以下代码引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Content{
   public Content(){} //empty constructor
} //end of Content class, emptiest class ever

public class Variants{
  Content x;

  public Variants(){ //Variants constructor
    x = new Content(); //point x of this instance towards a Content object
  }
} //end of Variants class

void main(){
  Contents[] v = new Contents[1]; //array for storing a variable coming from a Variants object


   v[0] = ((Variants)new Variants()).x; //store x of the
                                        //instance of Variants in our single cell.
   Print(typeof(v[0]))
}//end of main()

这是一个有效的声明:v[0] = ((Variants)new Variants()).x;还是会泄露物体?

v[0]是否指向x引用的对象?换句话说,当我们说Print(typeof(v[0]))时,我们是直接跳到x引用的对象,还是意味着从变量对象到它的x变量的移动?

如果计算机确实必须移动到variants实例,然后移动到x,正如我们提到的第0个单元格(由于值存储到数组中的方式)。打印速度会更快吗?

1
2
3
4
5
6
    Variants temp = new Variants()
    Contents cTemp = temp.x; //reference variable to point directly at x

    v[0] = cTemp; //feed in this pointer, not Variants.x instruction

Print(typeof(v[0]))


第一层不会漏水。它所做的就是创建一个variant,然后创建一个content,保存内容并丢弃变量,在其他时候这些变量将被垃圾收集。不会无限期保存内存。顺便问一下,为什么不直接创建内容?此外,行中的强制转换是不必要的,因为new运算符已经键入variant,因此强制转换是多余的。

关于Print(typeof(v[0]))。首先,我猜你说的是Console.WriteLine对吧?然后,typeof调用甚至不会编译。它需要的是类型,而不是变量或对象引用。它可以是编译时值的typeof(Content),也可以是获取变量表达式类型的v[0].GetType()调用。此外,它不会像您所暗示的那样只返回一个字符串,而是返回一个完整的Type对象,其中包含有关类的完整信息。

到了表演的地步。我对什么更快或更慢有疑问。虽然这个变量需要2个"跃点"才能到达常量,但是使用数组还需要访问Array类的索引器,这可能会增加一些开销。使用一个简单的局部变量最有可能获得几个循环,在您的示例代码中,这是完全可能的。但要真正回答速度问题,需要一个测试和基准。其他一切都只是猜测,或多或少受过教育,但只是猜测。编译器还可以优化所有这些帐户,使它们最终相等。另外,考虑到这种差异(如果有的话)很可能是最小的,并且只有当这种代码在一个紧密的循环中被调用时才是显著的和相关的。

我想你有C++背景,并试图把它改编成C语言。大多数事情都完全不同(特别是内存管理和泄漏)。除了名称和语法之外,这两种语言几乎没有任何共同之处,但是编程模型却大不相同。


Is this a valid statement: v[0] = ((Variants)new Variants()).x; or it will leak objects?

是的,这是一个有效的声明,不会泄露任何信息。但这会缩短:

1
v[0] = (new Variants()).x;

Does v[0] point to the object referenced by x?

是的,在那一点上,您的Variants对象可能已经被垃圾收集了(或者没有,您不知道),因为您没有保留任何对它的引用。

C中没有物体泄漏的情况。如果创建许多可访问的对象,例如通过将对象添加到静态列表中而从不删除它们,则可能会发生内存泄漏。但是,如果任何对象无法从其他代码访问,它迟早会被垃圾收集。

即使你有一个对象图,比如A点指向B,B点指向A,但是没有其他可到达的对象指向A或B,这两个对象都将被收集。

另外,不要担心这一点的性能,对象取消引用的影响非常小。