5

つまり、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;
    }
}

Ashortと2つの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); }
    }
}

これは無意味ですか?メリット/デメリットは何ですか?

4

5 に答える 5

3

.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境界に位置合わせされていることを意味します。

于 2010-08-27T19:44:51.417 に答える
2

値が互いに密接に結びついていて、通常は一緒に渡され、互いに独立して変更されることは決してないか、非常にまれである場合にのみ、複数の値をuintに詰め込むことを検討する必要があります。値を変更するためにuintをアンパックおよび再パックするコストは、3バイトを個別に格納する場合と比較して、これを(コードサイズと実行時間の点で)非常に高価にします。

合計10kバイトのRAMを搭載したマイクロデバイスで実行する場合、メモリは実行速度よりも重要であるため、このようにパックすることは価値があるかもしれません。通常のデスクトップPCまたは携帯電話デバイスでさえ、このパッキングはおそらく努力する価値がありません。

于 2010-08-27T19:54:34.120 に答える
1

構造体の定義をそのままにして、 StructLayoutAttribute.Packの値を1にしてStructLayout属性を適用することもできます。ただし、実際には、アクセス速度を犠牲にしてメモリを少し節約できます。これにより、データが節約されます。アクセスするのに最も効率的な方法でメモリに配置されます。コンパイラは通常、アクセスが効率的で、自動的に多くのメモリを損なうことのない方法でメモリをレイアウトします。

このアプローチは、少なくとも、提案したビットシフトアプローチよりもコードを理解しやすくします(実際には、マシンコードコンパイラがバイトコードから生成するものと類似している場合とそうでない場合があります)。

于 2010-08-27T19:59:42.450 に答える
0

発生するのは、メモリ内のデータオブジェクトのサイズと処理コストの間の単純なトレードオフです。メモリが本当に問題になる場合は、マシンにより多くのRAMを投入する方が簡単な場合があります。

于 2010-08-27T19:50:51.893 に答える
0

ものを整数に詰め込む価値がある場合がいくつかあります。通常、ストレージスペースだけでは適切な理由はありませんが、値を辞書のキーなどとして一緒に使用する場合、Dictionary(Of Integer、Whatever)はDictionary(Of SomeStructure、Whatever)よりもはるかに高速になります。

于 2010-08-27T21:14:33.300 に答える