2017-01-06 69 views
1

我明白,通過聯合,所有成員共享相同的內存。使用結構體時,它們不共享內存,因此內存中的不同空間分配給結構體的每個成員。如何讓結構一次只存儲一個變量? C++

我的解決方案需要我創建一個結構,它只存儲結構中存儲的一個類型的值;表現得像一個聯盟。我無法使用聯合的原因是因爲指定的其中一個「類型」是字符串,並且不能在聯合中包含字符串變量。我怎樣才能確保結構中只有一個成員一次佔用內存中的空間?

+0

如果你*沒有這種聯合式的要求,你可以顯示你的結構看起來像什麼嗎? –

+0

struct S { T1 t1; T2 t2; }; –

+1

我正在使用模板,因此類型可以變化,它們可以預定義或用戶定義 –

回答

0

我該如何確保一次結構中只有一個成員佔用內存空間?

可以使用std::any,或std::variant,如果你的編譯器支持(C++ 17),或者你可以你的模板類型

template <typename T> 
struct wrap 
{ 
    T elem; 
}; 
+0

我不明白這將如何允許OP的其他要求,使結構像一個聯盟行爲,因爲他不能讓它站立在其他類型。 – stix

+0

如果您尚未使用C++ 17,則可以使用Boost.Variant或Boost.Any。 – Argenet

+0

@Argenet - 你說的對,但是......也許我錯了......但我通常不會建議不嚴格的iso標準的解決方案。 – max66

-3

你不行。結構總是相同的大小。當您創建一個結構體時,編譯器爲結構體中的每個成員變量保留空間並將其定義爲結構體的大小。當代碼要求內存管理器爲結構分配內存時,無論所有變量是否被使用,它都會分配相同數量的內存。

最好的選擇是將字符串轉換爲可用於聯合的另一種類型,例如固定大小的字符數組。

+0

這將會倒退。 –

+0

提問者從來沒有任何要求使用盡可能少的內存 –

8

你需要(大小max(sizeof(T1), sizeof(T2), sizeof(T3)...)的)一個緩衝,放置新的和一個枚舉變量來記住哪個對象當前在緩衝區中。它被稱爲「標記聯盟」。然後,您需要編寫成員函數來安全地控制此人工授精對象的生命週期。最後,你需要花費幾天的時間來解決任何對齊需求。

但這就是boost::variant所做的只是使用它。它也很快會變成std::variant

相關問題