Where to place mutable members in class?
在 C++ 裡,若 member data 被宣告為 mutable,表示即使是在「常數情境」下,如物件本身被宣告為 const,或執行於宣告成 const 的 member function 裡時,該 member data 仍然可以被修改。
這通常用於,如 mutex 這種,其實不屬於概念上的物件內容,但又需要存在於物件裡以維持正確運作的那些 member data。可是,這種「不屬於概念上的物件內容,但又需要存在於物件裡的」member data,該怎麼擺放於物件裡?
於是,在 #cpp-tw 裡,有了這樣的討論:
11:38 <jeffhung> 假設我們有一個 mutable mutex 的 member data,要放在 class 裡最前面,還是
最後面?
11:39 <jeffhung> 放最後面的好處是,這些 mutable 的 member,在轉成 persistent form 時,可
以直接 memcpy 然後把尾巴的 mutable members 去掉。
11:40 <jeffhung> 放最前面的好處是,sub object 的 construct order 是按順序來的,所以可以保
證 mutex object 比其他 member 還要早 construct,還要 晚 destruct。
11:40 <jeffhung> 這樣甚至可以在 initialization-list 裡 lock mutex。 (but how?!)
11:43 <jeffhung> (另一個擺法是,把 mutex 放在 parent)
11:43 <l*> 或者放在外頭.... ? XD
11:43 <l*> (use a key-value table to store that....?)
11:44 <jeffhung> l*: 那這個 key-value table 可能也要 lock,會產生 bottleneck
目前我傾向於擺在前頭。我認為,物件內容的正確性,是第一要務,使用方便與否,則在其次。但關於這個議題,可能還有還沒考慮到的地方,因此也暫時沒有定論。諸位覺得呢?



Post a Comment