微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 使用模板,xor和指向内存的指针进行非常残酷的交换

使用这种swap实现的最大威胁是什么?除了线程安全和差的优化.什么时候失败(反例)?
template<typename T>
void swapViaMemory(T& left,T& right) {
    if(&left == &right) { return ; }

    unsigned int tSize = sizeof(T);
    unsigned char* lPtr = reinterpret_cast<unsigned char*>(&left);
    unsigned char* rPtr = reinterpret_cast<unsigned char*>(&right);

    for(unsigned int i = 0; i < tSize; ++i) {
        *(lPtr + i) ^= *(rPtr + i);
        *(rPtr + i) ^= *(lPtr + i);
        *(lPtr + i) ^= *(rPtr + i);
    }
}

对不起语法错误和拼写错误(=

解决方法

如果T包含一个成员,该成员是指向另一个成员的指针或引用,则这将失败(假设指针/引用成员的目的是始终指向/引用属于该实例的数据成员).
struct foo
{
  foo() : i(),ref_i(i),ptr_i(&i) {}
  int i;
  int& ref_i;
  int *ptr_i;
};

如果有两个foo对象,比如f1&使用swapViaMemory交换f2,交换后,f1.ref_i和f1.ptr_i将引用/指向f2.i,反之亦然.此外,在引用成员的情况下,这会调用未定义的行为,因为重新定位引用是非法的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐