簡體   English   中英

內存順序中的 std::array 和 std::tuple

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM