簡體   English   中英

使用結構作為類型檢查原語的包裝器的開銷?

[英]Overhead of using structs as wrappers for primitives for type-checking?

假設我想獲得額外的類型檢查,以使用在語義上意味着不同事物的原語:

public struct Apple
{
    readonly int value;

    // Add constructor + operator overloads
}

public struct Orange
{
    readonly int value;

    // Add constructor + operator overloads
}

關鍵是我們不能比較“蘋果和橘子”,所以將實際的 int 包裝在一個結構中意味着我們可以通過代碼獲得類型檢查和一些額外的可讀性和文檔。

我的問題是:就 memory 和速度而言,與此相關的開銷是多少? 由於結構是值類型,包含這些結構的變量是 32 位還是更大? 使用這些結構而不是原語的性能開銷怎么樣 - 運算符重載是否有很大的開銷?

關於這樣做是否明智的任何其他建議?

在 memory 中,使用可以使用Marshal.SizeOf()驗證的結構沒有開銷:

struct testStruct
{
    public readonly int value;
}
..

int size = Marshal.SizeOf(typeof(testStruct)); //returns 4

這也與sizeof(testStruct)返回的相同:

unsafe
{
    int size = sizeof(testStruct); //returns 4
}

根據MSDN ,這兩種大小調整方法之間的區別是:

雖然可以使用 Marshal.SizeOf 方法,但此方法返回的值並不總是與 sizeof 返回的值相同。 Marshal.SizeOf 返回封送類型后的大小,而 sizeof 返回由公共語言運行時分配的大小,包括任何填充。

我可能會因此而被回避,但你可以這樣做:

using Apple = System.Int32;
using Orange = System.Int32;

您將無法跨文件使用它。 從技術上講,您仍然可以將蘋果與橙子進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM