我有以下的工會:指向聯盟的向量。如何正確訪問聯合元素?
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對。
這是我所想達到
「但最佳做法是什麼」 不要在任何地方使用聯合 – Starl1ght
做指針算術的最佳做法是遠離。工會也一樣。 –
如果您至少會推薦您的評論。我需要工會,如果你喜歡工會或不是問題。這只是一個很小的例子,它可以顯示我的問題,如果我的想法有效,我也可以嘗試。但是這不是可能的atm,這就是爲什麼我在這裏問。沒有理由開始舊的討論不使用這個。 –