如果我有三个可以全部符合32位的单独值,那么使用uint存储它们是否有意义?

Dan*_*Tao 5 .net performance struct data-formats alignment

我的意思是,说我有一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

A 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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dir*_*mar 3

在 .NET 中,当你无论如何都要使用 a时,你也可以像这样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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将产生字段按顺序布局的效果,例如字段B将从偏移量 16 开始。

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