為什麼在C 中泛型型別不能是Explicit Layout的?

時間 2021-06-27 03:51:47

1樓:

這個LayoutKind列舉的 Explicit 的值,文件是這樣定義的:在未管理記憶體中的每乙個物件成員的精確位置是被顯式控制的,服從於Pack欄位的設定。每個成員必須使用FieldOffsetAttribute指示該字段在型別中的位置。

就是,成員必須有FieldOffsetAttribute去顯式指定其記憶體的位置。像這樣:

[StructLayout(LayoutKind.Explicit)]

public

struct

SYSTEM_INFO

Explicit Layout中文是顯式布局。所以,當結構加上該標籤[StructLayout(LayoutKind.Explicit)]時,意思為:

該結構體內的每個成員都需要被顯式指定其物理位置。即開發者需手動通過FieldOffsetAttribute寫出其成員的物理位置。泛型例項化時,其實是沒有指定成員的物理位置的。

泛型本身就是減少裝箱和拆箱的操作而出現的。編譯器本身有一套動態的針對泛型的物理位置操作(就是,兄弟,我這邊預設幫你搞好一波了,具體你不用管,你用就是了)。在這點上,泛型的物理位置 自動 操作和想要 手動 顯式指定物理位置的想法,其實是矛盾的。

而且除值型別外,泛型還可以用於引用型別。如果公開顯式指定物理位置,情況就變得很複雜了,容易導致型別不安全。又或者裡面實現的方式是無法顯式管理記憶體的吧。

我猜大概是這樣吧,所以不允許Explicit Layout。

LayoutKind 列舉 (System.Runtime.InteropServices)

FieldOffsetAttribute 類 (System.Runtime.InteropServices)

為什麼同是泛型型別變換,第乙個不能輸出結果,第二個卻能?

這個程式猿不太禿 這裡第二個程式之所以能夠輸出資料,是因為 System.out.println 方法。第乙個程式,b中name資料的型別是Interage型別,將b的值賦予a,此時a中name資料的型別也是Interage型別,但是由於在定義a例項的時候,給了泛型String,所以在呼叫 Syst...

C 中超出精度double型別的值為什麼會出現這種現象?

邱昊宇 真心沒那麼複雜。問 比 3 小的最大 double 究竟是多少?答 是 std nextafter 3.0,2.0 比如 double maxBelowThree std nextafter 3.0 2.0 auto uniqueDigits std numeric limits max d...

C 中為什麼派生類中只有基本型別時,delete乙個指向派生類的基類指標時卻沒有記憶體洩漏?

你試試這樣 class widget public QWidget MSVC的string實現方式是SSO,大致的原理是內建乙個char棧陣列,如果字串很短的話就不使用堆記憶體,你那個寫法string還是空的,沒有分配堆記憶體,從頭到尾都只在棧上有資料當然不存在記憶體洩漏問題,所以你還需要強制地給s...