Blittable 類型

Blittable 類型是托管代碼和本機(jī)代碼中具有相同位級(jí)別表示形式的類型。 因此,無需將這些類型轉(zhuǎn)換為其他格式即可往返本機(jī)代碼進(jìn)行封送,而且由于這樣可以提高性能,應(yīng)首選這些類型:
1、byte, sbyte, short, ushort, int, uint, long, ulong, single, double
2、Blittable 類型的非嵌套一維數(shù)組(例如,int[])
3、具有實(shí)例字段只有 blittable 值類型的固定布局的結(jié)構(gòu)和類
固定的布局需要 [StructLayout(LayoutKind.Sequential)] 或 [StructLayout(LayoutKind.Explicit)]
默認(rèn)情況下結(jié)構(gòu)為 LayoutKind.Sequential,類為 LayoutKind.Auto
4、不是 blittable: bool
5、有時(shí)為 blittable: char,string
如果 char 位于一維數(shù)組中, 或者如果它是包含使用 CharSet = CharSet.Unicode 的 [StructLayout] 顯式標(biāo)記的類型的一部分,則該類型為 blittable。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct UnicodeCharStruct
{
    public char c;
}

如果 string 不包含在其他類型中,并且作為使用 [MarshalAs(UnmanagedType.LPWStr)] 標(biāo)記的參數(shù)傳遞或 [DllImport] 已設(shè)置 CharSet = CharSet.Unicode,則該類型為 blittable。

引用:https://docs.microsoft.com/zh-cn/dotnet/standard/native-interop/best-practices#blittable-types

可以直接內(nèi)存錨定可以用來判斷是否blittable:

//這段代碼來自網(wǎng)絡(luò),我也不知道對(duì)不對(duì),暫時(shí)留在這里作為參考
static bool IsBlittable(object obj)
{
    try
    {
        GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);  //<--
        handle.Free();
        return true;
    }
    catch { }
    return false;
}
static void Main(string[] args)
{
    bool b1 = IsBlittable((byte)0);    // true
    bool b2 = IsBlittable(true);       // false
    bool b3 = IsBlittable(0);          // true
    bool b4 = IsBlittable((char)0);    // false
    bool b5 = IsBlittable(new int[3]); // true
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容