簡體   English   中英

關於字節交換的常規交換實現

[英]General swap implementation in terms of byte swap

當前標准庫中常規交換的實現類似於

template <class T>
void swap(T& a, T& b) {
  T c(move(a));
  a = move(b);
  b = move(c);
}

我想知道是否可以執行以下操作。

template <class T>
void swap(T& a, T& b) {
  unsigned char x;
  auto pa = reintepret_cast<unsigned char*>(&a);
  auto pb = reintepret_cast<unsigned char*>(&b);
  auto pc = pa + sizeof(a);
  while (pa != pc) {
    x = *pa;
    *pa = *pb;
    *pb = x;
    ++pa, ++pb;
  }
}

我認為此實現在空間使用方面更好,因為它僅占用一個字節。

交換類時有許多注意事項需要解決。 對於POD類型,交換字節正常工作。 但是,更復雜的類可能依賴於字節交換不會考慮的不變量。 例如,考慮對成員變量的引用:

struct Foo {
    Foo() : bar{}, barRef{bar} {};
    int  bar;
    int& barRef; // Expected to refer to the neighboring `bar`
};

int main()
{
    Foo f{};
    {
        Foo g{};
        byte_swap(f, g);
    }
    // `f` is now invalid: `f.barRef` is pointing to garbage
}

您必須考慮到,每個類都可以定義當實例被其自身復制或移動時應該發生的情況。 有時,一個類可能會做一些不同的事情,然后移動它的字節。 也許該類存儲了一個指向同一實例成員的指針。 只是復制字節會破壞實例。


我還認為這不會有太大變化。 當應用程序需要60個字節以上時,它並不是很明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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