繁体   English   中英

Class自动属性的内存分配

[英]Memory allocation of a Class auto properties

我有一个具有多个属性的类。 例如

public class Customer
    {
        public int id { get; set; }
        public string abc{ get; set; }
        public bool abcd { get; set; }
        public string abcde { get; set; }
        public string abcdef { get; set; }
        public string abcdefg { get; set; }
        public string abcdefgh { get; set; }
        public string xyz { get; set; }     
    }

现在,我想知道get set属性消耗了多少内存空间。 在一个API调用中,我只需要几个属性,而在另一个API调用中,则需要所有这些属性。 因此,我想知道是否应该创建两个不同的类,并将其用于单独的API调用,还是仅使用具有多个get set属性的一个公共类,并将其用于我的API调用。 任何指导将不胜感激。 谢谢

通常将intbool打包成8个字节; string引用采用4(32位)或8(64位)作为引用。 如果字符串具有非null值 ,则将单独分配该空间,该空间将是字符串所需的任何空间。

但坦率地说:除非您要分配数百万个 ,否则将其拆分为2种不同的类型将不会为您节省任何实际费用 -简直就是sha牛。 特别是对于字符串为null

我们必须排除字符串。 这个范围可以从“空”到“今天的最大长度”。

理论上,“自动实现”属性的成本应与最小的手动属性相同:一个后备字段。 一键通一集功能。 关于属性的最重要的单个规则是不要意外地访问类代码中的后备字段。 通过简单地不给Backing Field一个可以使用的名称,Autoimplement Properties就可以做到这一点。 它仍然在那里。 它可能具有一个从“反射”的“属性”名称派生的名称。 但是您的代码没有真正的方法来访问它。

从理论上讲,因为现在是JiT。 JiT可以进行很多优化:

  • 那些自动访问器是很少的代码。 因此,有很大的机会使它们内联的成本低于调用它们的成本。 因此,我给了JiT 90%的机会来内联这些代码。
  • 如果创建一个临时变量以在下一行使用它,则该变量可能会遇到DeadCode检测。 Wich表示将其剪下并替换为原始访问。
  • 但是,顺带一提,它的发展方向也相反。 为了解决ArrayBounds Checks固有的开销,JiT可能会检测具有相同Index的“冗余访问”并创建一个临时变量来使用。

虽然我还没有读过它,但我不排除JiT甚至可以从类中删除未使用的属性。 仅仅是运行时的优化。 它至少可以将未访问的变量(及其初始化)切掉为无效代码。 当我尝试强制使用2 GiB OOM时发现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOM_32_forced
{
    class Program
    {
        static void Main(string[] args)
        {
            //each short is 2 byte big, Int32.MaxValue is 2^31.
            //So this will require a bit above 2^32 byte, or 2 GiB
            short[] Array = new short[Int32.MaxValue];

            /*need to actually access that array
            Otherwise JIT compiler and optimisations will just skip
            the array definition and creation */
            foreach (short value in Array)
                Console.WriteLine(value);
        }
    }
}

我同意这是微观优化。 但更重要的,这些可能是那些在JIT可以为你已经这样做 因此,您可能一无所有。 就我个人而言,在进行此类优化之前,我更喜欢代码的可读性和可调试性。 我经常可以做一些“无效”的事情,因为我可以依靠JiT会适当地处理它的知识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM