2011-03-05 70 views
5

經過一番調查後,我發現C++ 0x將元組中的元素向後存儲在內存中。C++ 0x元組存儲元素向後

例如,利用這個代碼:

std::tuple<char, char, char> x('\0', 'b 'a'); 
char* y = (char*)&x; 
std::cout << sizeof(x) << std::endl; 
std::cout << y << std::endl;

當與GCC 4.5.2編譯,我得到以下的輸出:

3 
ab

這最初我迷惑不解。爲什麼數據存儲倒退?通過GNU的無意混淆頭狩獵後,我注意到,實施類似於此:

template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...> 
{ 
    head value; 
    ... 
};

因爲基類中包含的最後一個元素,那麼下一個派生類中包含了倒數第二,等等,實際模板參數的順序相反。

當我第一次進入元組時,我認爲我可以將它們用於像glInterleavedArrays()這樣的函數,它將頂點數據的數組設置爲顏色,紋理座標,法線和點的元組。當然,如果我創建了一個元組數組,這些數據將不得不反向輸入,如果您忘記將參數按正確的順序排列,這可能會導致非常奇怪的錯誤。

那麼這樣的事情呢?

template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...> 
{ 
    tail value; 
    ... 
};

下GCC 4.5.2:

error: parameter pack argument ‘head ...’ must be at the end of the template argument list

除非本可用在未來,我幾乎停留在尋找另一種方式來實現這一點。有另一種方法嗎?一些欺騙海灣合作委員會獲得一個正確排序的元組記憶方式?

回答

5

您正在探索的元組佈局是未指定的元組實現細節。其他實現將有其他佈局。如果你寫這個,根據gcc的佈局,你的代碼可能不能移植到其他std :: libs。

libc++元組實現(例如)具有相反的(按順序)佈局。

5

你爲什麼在乎元組的實現是什麼? Program to an interface, not an implementation

如果您只通過其公佈的接口使用元組,那麼您將按照您將其放入的順序排列對象。如果您直接通過訪問其內容來破壞封裝,例如通過在您的例如,所有投注都關閉。

+0

我已經說過爲什麼 - 'glInterleavedArrays()'是一個請求交錯數據數組的函數。我的意圖是創建一個元組類,它將按照這個原則進行操作 - 將數據交織在元組數組中,以便我可以將數據傳遞給GL。如果你想了解更多信息,請參閱OpenGL文檔:http://www.opengl.org/sdk/docs/man/xhtml/glInterleavedArrays.xml – 2011-03-05 21:22:08

+0

@RetroX:然後而不是依靠元組的實現,你需要一個對象其接口以已知的順序提供序列化手段。無論哪種方式,您都希望接口提供保證,以便您不受實施細節的限制。 – 2011-03-05 21:51:37