[英]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.