Jak utworzyć unię C/C++ przy użyciu atrybutów w języku C#
Za pomocą atrybutów można dostosować sposób stosowania struktur w pamięci. Można na przykład utworzyć to, co jest znane jako unia w języku C/C++ przy użyciu StructLayout(LayoutKind.Explicit)
atrybutów i FieldOffset
.
W tym segmencie kodu wszystkie pola TestUnion
rozpoczynające się w tej samej lokalizacji w pamięci.
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[System.Runtime.InteropServices.FieldOffset(0)]
public int i;
[System.Runtime.InteropServices.FieldOffset(0)]
public double d;
[System.Runtime.InteropServices.FieldOffset(0)]
public char c;
[System.Runtime.InteropServices.FieldOffset(0)]
public byte b;
}
Poniższy kod to kolejny przykład, w którym pola zaczynają się od różnych jawnie ustawionych lokalizacji.
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[System.Runtime.InteropServices.FieldOffset(0)]
public long lg;
[System.Runtime.InteropServices.FieldOffset(0)]
public int i1;
[System.Runtime.InteropServices.FieldOffset(4)]
public int i2;
[System.Runtime.InteropServices.FieldOffset(8)]
public double d;
[System.Runtime.InteropServices.FieldOffset(12)]
public char c;
[System.Runtime.InteropServices.FieldOffset(14)]
public byte b;
}
Dwa pola i1
całkowite i i2
połączone współdzielą te same lokalizacje pamięci co lg
. Używa lg
pierwszych 8 bajtów lub i1
używa pierwszych 4 bajtów i i2
używa kolejnych 4 bajtów. Ten rodzaj kontroli nad układem struktury jest przydatny podczas korzystania z wywołania platformy.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla