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