[英]std::array and std::tuple in memory order
我正在測試一個小代碼片段,我很驚訝 4 個字節的相同表示與放入 std::array 和 std::tuple 產生不同的內存布局
#include <iostream>
#include <tuple>
#include <array>
struct XYZW {
uint32_t x;
uint32_t y;
//std::array<uint8_t,4> z;
std::tuple<uint8_t, uint8_t, uint8_t, uint8_t> z;
uint32_t w;
};
int main() {
XYZW i;
i.z = {255, 0, 0, 0};
uint32_t z = (*reinterpret_cast<uint32_t*>(&i.z));
std::cout << z << " \n";
}
對於元組,輸出為: 4278190080
,而對於數組,輸出為: 255
。 這是預期的嗎?
std::array
具有標准指定的布局,但std::tuple
沒有,並且可以是實現想要的任何東西。
因此,預計它們可能會有所不同,但當然,它們也可能碰巧在某些編譯器/版本/平台上選擇了相同的布局 - 只是不能保證。
實際上,實現std::tuple
的最簡單方法之一是遞歸,因為它最初是在 Loki 庫中完成的。 這將以相反的順序布置字段(最基類,其子對象首先出現,是類型列表最后一個成員的葉)。 但這並不是唯一可能的實現,我觀察到編譯器/標准庫實現之間的字段順序不同。
注意。 如評論中所述,您當前的診斷具有 UB - 但是,您可以安全地在reinterpret_cast<char*>(&i.z)
處對 4 個字節進行reinterpret_cast<char*>(&i.z)
並獲得等效結果。
std::array 和 std::tuple 產生不同的內存布局
這是預期的嗎?
是的,這種可能性是可以預料的,盡管不能保證。
更具體地說,數組元素的內存順序是較低的索引位於較低的內存地址中。 元組元素的內存順序未指定。 作為元組通常實現方式的副作用,逆內存順序是典型的。
uint32_t z = (*reinterpret_cast<uint32_t*>(&i.z));
這會導致未定義的行為。 元組不是(保證是)標准布局類型,因此您不能將它們別名為它們的第一個成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.