2017-04-03 52 views
-1

我有以下的工會:指向聯盟的向量。如何正確訪問聯合元素?

union uval_t 
{ 
    size_t _size; 
    void* _pointer; 
    uint32_t _tid[2]; 
}; 

如果我現在做到以下幾點:

std::vector<uval_t*> uvalPointerVec; 
uvalPointerVec.push_back((uval_t*)malloc(sizeof(uval_t) * 1000)); 

如何正確地訪問數組中的工會嗎?假設我的第一個聯盟價值是size_t。我可以這樣做:

uvalPointerVec[0]->_size = 1000; 

但什麼是做指針運算與工會指針訪問elemets的最佳實踐?

示例:我可以執行以下操作來訪問我的向量中的第一個聯合指針,並在存儲我的_size的位置後訪問該位置?

uvalPointerVec[0][1]->_tid[0] = 42; 
uvalPointerVec[0][1]->_tid[1] = 24; 
uvalPointerVec[0][2]->_pointer = somePointer; 

我得到以下結果嗎?

| 1000 | 42 | 24 | 0x... | 
^ ^
| |_First union value 
|_union pointer 

編輯:我想我的問題的答案(沒有嘗試,尚未),但所有的困惑多一點點的上下文。我實現了數據庫系統的物理代數。例如,Scan運算符讀取存儲在內存中的數據,並將所有元組保存在某種數據結構中。目前,Scan運算符是作爲模板實現的,並且必須適用於不同的頁面佈局(行存儲[nsm = n-ary store model] vs列存儲[pax = partition attributes across])。存儲檢索到的元組的數據結構也必須適用於兩種頁面佈局。在NSM(例如,行存儲)中,我可以通過指向該元組的單個指針訪問元組,因爲所有屬性都以連續方式存儲。對於其他頁面佈局,我需要兩個整數來精確地處理元組:頁面上的頁碼和記錄號(tid)。由於某些優化原因,我不想現在討論大小。所以如果我現在想要掃描一個NSM頁面,我可以在我的數據結構中存儲指向元組的指針,如果我掃描一個PAX頁面,我可以重複使用相同的數據結構,而不是存儲指針,我存儲PageNo/TupleNo對。

這是我所想達到

+2

「但最佳做法是什麼」 不要在任何地方使用聯合 – Starl1ght

+0

做指針算術的最佳做法是遠離。工會也一樣。 –

+0

如果您至少會推薦您的評論。我需要工會,如果你喜歡工會或不是問題。這只是一個很小的例子,它可以顯示我的問題,如果我的想法有效,我也可以嘗試。但是這不是可能的atm,這就是爲什麼我在這裏問。沒有理由開始舊的討論不使用這個。 –

回答

2

短版本的正確方法是這樣的:

vector[i][j].member = value; 

哪裏是索引到矢量元素和Ĵ是數組元素索引 i

這是風馬牛不相及的問題,但您使用的是批C而不是C++的,我建議你更換

(uval_t*)malloc(sizeof(uval_t) * 1000) 

有了更多的標準(但仍然不是渴望):

new uval_t[1000] 

或一個更美好,更可以接受的:

std::array<uval_t, 1000>() //fixed size 
std::vector<uval_t>(1000) //resizable 

他們是更安全和更容易的方式來他們也會在元素被替換或刪除時釋放自己。如果您確保事先分配您需要的數量,陣列將具有相同的性能和向量。

+1

不要寫'new uval_t [1000]'。根本不要寫'新'。數組和向量的例子很好。 –

+0

......雖然我不確定OP有意或無意做什麼。也許他們正在嘗試手工製作2D容器? –

+0

我甚至無法想象他在做什麼,這太奇怪了。 –