2014-10-02 13 views
9

boost :: variant似乎是一個處理異構類型集合的強大容器。我想知道它的成本。在內存中,我認爲它佔用了最大類型的大小加上表示哪個()的整數。對於apply_visitor(),我認爲它的性能非常好,它可以直接調用除了很多if之外的函數。我的觀點正確嗎?什麼是boost :: variant memory和性能成本?

+0

Boost是開源的。你可以做一些研究並瀏覽源代碼。它看起來像你已經知道要尋找什麼。 – Drop 2014-10-02 05:48:27

+2

'apply_visitor'在底層做了很多ifs(實際上它更像是一個(大的,元程序化的)開關('which()'),顯然,這只是最低工作量。 ) – sehe 2014-10-02 06:52:00

回答

11

你幾乎是正確的。

boost::variant的大小是任意元素的最大尺寸,根據需要舍入爲最大對齊,再加上一些整數的大小,再次舍入。

想一想這些類型的變體,假定標籤是uint32_t

struct foo { uint32_t value[3]; }; // size 12, align 4 
struct bar { uint64_t v2; }; // size 8, align 8 

未標記的聯合必須具有尺寸16,對齊8;加上4個字節的標籤必須上去大小24保持對齊8

或者考慮的變體:

struct foo { uint8_t value[5]; }; // size 5, align 1 
struct bar { uint16_t v2; }; // size 2, align 2 

這些未標記的工會必須有大小6,對準2;添加4字節的標籤迫使你的大小12,對齊4.

對於調用,我期望它使用一個函數的數組查找(這就是我實現我自己的變體,這是必要的,因爲增強沒有支持移動構造函數),因爲如果鏈條表現不佳並且切換是不可能的。

相關問題