zoukankan      html  css  js  c++  java
  • C# struct 性能损失

    虽然结构是值类型,但在语法上常常可以把它们当作类来处理。例如,在上面的 Dimensions 类
    的定义中,可以编写下面的代码:
    Dimensions point = new Dimensions();
    point.Length = 3;
    point.Width = 6;
    注意,因为结构是值类型,所以new 运算符与类和其他引用类型的工作方式不同。new 运算符并
    不分配堆中的内存,而是调用相应的构造函数,根据传送给它的参数,初始化所有的字段。对于结构,
    可以编写下述代码:
    Dimensions point;
    point.Length = 3;
    point.Width = 6;
    如果Dimensions 是一个类,就会产生一个编译错误,因为point 包含一个未初始化的引用--不指
    向任何地方的一个地址,所以不能给其字段设置值。但对于结构,变量声明实际上是为整个结构分配
    堆栈中的空间,所以就可以赋值了。但要注意下面的代码会产生一个编译错误,编译器会抱怨用户使
    用了未初始化的变量:
    Dimensions point;
    Double D = point.Length;
    结构遵循其他数据类型都遵循的规则:在使用前所有的元素都必须进行初始化。在结构上调用
    new 运算符,或者给所有的字段分别赋值,结构就完全初始化了。当然,如果结构定义为类的成员字
    段,在初始化包含对象时,该结构会自动初始化为0。
    结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负
    面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。
    在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构
    赋给另一个结构(例如A=B,其中A 和B 是结构),结构的所有内容就被复制,而对于类,则只复制
    引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结
    构。但当把结构作为参数传递给方法时,就应把它作为ref 参数传递,以避免性能损失--此时只传递
    了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就
    必须注意被调用的方法可以改变结构的值。

  • 相关阅读:
    playbook的复用
    playbook 任务标签
    playbook handlers 触发器
    playbook循环语句
    playbook条件语句
    Ansible变量
    每日总结4.13
    每日总结4.12
    每日总结4.9
    每日总结4.8
  • 原文地址:https://www.cnblogs.com/opps/p/3726707.html
Copyright © 2011-2022 走看看