我想使用xor algorithm交换两个局部变量,但是它不允许我更改变量的地址。如果我创建指向变量的指针,它将允许它,但是可以在不使用指针的情况下执行此操作吗?
我正在尝试这样做
Point a = Point();
Point b = Point(1,1);
&a ^= &b;
&b ^= &a;
&a ^= &b;
这是我能够达到我想要做的最接近的
Point a = Point();
Point b = Point(1,1);
Point *a_ptr = &a;
Point *b_ptr = &b;
a_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
b_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
b_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
// The pointers are switched, but this will not work
&a = a_ptr;
答案 0 :(得分:1)
唯一可行的方法是,如果你实际上对点的值进行了xor交换。在您的代码中,您似乎正在尝试在堆栈上设置一个您无法执行的值的地址。
我建议使用std::swap
http://en.cppreference.com/w/cpp/algorithm/swap。
要使用它,你的对象将赋予moveContructible和moveAssignable。
所以简而言之,确切地说你想做的事情是不可能的,因为你不能分配给变量的地址。但是你可以使用point的值,多种方式实现类似的效果,制作指针或std::swap
答案 1 :(得分:0)
C语言变量在运行时不存在,就像高级语言中的变量一样。局部变量“a”对编译器来说意味着“堆栈帧的地址 - 2”,或者它是什么。此引用仅在编译时存在,并由声明修复。在运行时,生成的代码只是从硬编码的地址中提取。因此,使用代码使变量指向不同的位置是试图改变不存在的东西。