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

标签 .net struct performance alignment data-formats

我的意思是,假设我有一个 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); }
    }
}

这是没有意义的吗?有什么好处/缺点?

最佳答案

在 .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 开始。

Pack 的值为 1表示字段在 byte 处对齐边界。

关于.net - 如果我有三个独立的值都可以放入 32 位,那么使用 uint 来存储它们是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587593/

相关文章:

C++ 匿名结构调用失败

c - 尝试将一个结构体的字段复制到 c 中的另一个结构体?

c# - 防止代码定时部分的上下文切换(或测量然后减去实际未在线程中花费的时间)

linux - 将 IPC(指令/周期)连续传递给其他函数或变量

c++ - 单/ double SpMV 在 CPU 上的性能

c# - 如何将 c 合并到 c# 中(特别是 lex)

java - 从 Web 服务响应中删除时区

c# - 如何使用 Rhino Mocks 模拟索引属性?

c - 如何将二维数组静态初始化为指向指针的指针?

c# - JSON.net(反)序列化未类型化的属性