代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

如果我有三个独立的值,都可以放入32位,那么使用uint来存储它们有意义吗?

  •  5
  • Dan Tao  · 技术社区  · 15 年前

    我的意思是,假设我有一个 struct 表示一些数据,如下所示:

    struct LilStruct
    {
        public readonly short A;
        public readonly byte B;
        public readonly byte C;
    
        public LilStruct(short a, byte b, byte c)
        {
            A = a;
            B = b;
            C = c;
        }
    }
    

    short 还有两个 byte 所有值都可以放入32位。我想知道的是(出于对齐的目的、性能等等),用以下格式存储这些数据是否有意义:

    struct LilStruct
    {
        private readonly uint _value;
    
        public LilStruct(short a, byte b, byte c)
        {
            _value = ((uint)a << 16) | ((uint)b << 8) | (uint)c;
        }
    
        public int A
        {
            get { return (int)(_value >> 16); }
        }
    
        public int B
        {
            get { return (int)(_value >> 8) & 0x000000FF; }
        }
    
        public int C
        {
            get { return (int)(_value & 0x000000FF); }
        }
    }
    

    5 回复  |  直到 15 年前
        1
  •  3
  •   Dirk Vollmar    15 年前

    在.NET中,当您要使用 struct 无论如何,你也可以用 StructLayoutAttribute 这样地:

    [StructLayout(LayoutKind.Sequential, Pack=1)]
    struct LilStruct
    {
        public readonly short A;
        public readonly byte B;
        public readonly byte C;
    
        public LilStruct(short a, byte b, byte c)
        {
            A = a;
            B = b;
            C = c;
        }
    }
    

    B 将从偏移量16开始。

    值为1表示 Pack 表示字段在 byte

        2
  •  2
  •   dthorpe    15 年前

    当在总共有10k字节RAM的微型设备上执行时,像这样打包可能是值得的,因为内存比执行速度更宝贵。在一台普通的台式电脑甚至是移动电话设备上,这种包装可能不值得花那么多精力。

        3
  •  1
  •   Frank    15 年前

    您可以继续使用结构定义,并应用 StructLayout 带有 StructLayoutAttribute.Pack

    这种方法至少比您提出的位移位方法更容易理解您的代码(实际上,这种方法可能与机器代码编译器从字节代码生成的代码相似,也可能不相似)。

        4
  •  0
  •   kbrimington    15 年前

    您将遇到的是内存中数据对象的大小和处理成本之间的简单权衡。如果内存是一个真正的问题,它可能只是更便宜的抛出更多的内存在您的机器。

        5
  •  0
  •   supercat    15 年前

    在有些情况下,把东西塞进整数是值得的。单独的存储空间通常不是一个好的理由,但是如果这些值一起被用作字典的键,那么一个字典(整型的,不管什么)将比一个字典(SomeStructure的,不管什么)快得多。

    推荐文章