簡體   English   中英

演員陣容比標記的工會更有效率嗎?

[英]Can casts be more performant than tagged unions?

我正在設計一個經典的虛擬機,它將在某種通用的類型轉換值上運行 - 現在用標記的聯合表示:

typedef struct val {
    val_type type;
    union {
        int            i;
        unsigned int   u;
        double         f;
        str *        str;
        vec *        vec;
        map *        map;
    };
} val;

我在網上找到了大量有關此內容的文獻,並得出結論認為這是一個非常正統的解決問題的方法。 不過,我想知道是否可以通過這樣的方法改進性能:

typedef struct val_int {
    val_type type;
    int i;
};

typedef struct val_str {
    val_type type;
    char * buffer;
    size_t length;
    size_t capacity;
};

typedef struct val_vec {
    val_type type;
    val_type ** members; // <-- access member by cast
    size_t length;
    size_t capacity;
};

在這里,我推斷在訪問基元類型的額外間接成本(以及需要執行單獨分配 - 可能有助於池化)之間存在權衡,與存儲在諸如val_vec集合中的內存保持val_vec ,將它所代表的當前胖指針的大小減半。 我知道這里簡單的答案將是“衡量它”,但我很難想出一個不具備完整實現的充分代表性的模型。

是否有第二種方法的名稱,並且 - 假設這將被仔細管理(但假設它不會導致不確定的行為)是否有一個廣泛理解的風險,我不考慮? 哪種方法更適合這里?

順便說一句,柔性陣列成員的使用是否也可以類似地使用?

我推斷在訪問基元類型的額外間接成本之間存在折衷

過早優化很少值得您寶貴的編碼時間。 這里的任何變化最多都是線性的。 6.001 vs 1/2打另一個。

在您選擇的情況下,這種或那種方式可能會更好,但提供給編譯器的信息越多,它就越有可能比這里更好地進行優化。

清晰的代碼,通常是避免演員表。

由於通常不正確的假設,替代方案缺乏細節並且可能存在問題: void *val_type *是一個通用指針,指向FP的指針可以很好地轉換為其他指針,對於其他類型,對齊已經足夠,抗鋸齒不是問題。

在后一種情況下,您可能也會定義

typedef union val {
    val_type           type;
    struct val_int     val_int;
    struct val_str     val_str;
    struct val_vec     val_vec;
} val;

現在你有一個可以保存任何值類型的聯合類型。 實際上,這是在匿名工會和結構存在之前這樣做的常見方式。 當你有一個你知道的對象永遠只是一個val_int時,只需分配一個val_int並將其地址轉換為val *就可以節省幾個字節的內存。

暫無
暫無

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

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