在我的大学时代,我读到了auto关键词,随着时间的推移,我实际上忘记了它是什么.它被定义为:
将局部变量定义为具有本地生命周期
我从来没有发现它在任何地方都被使用过,它是否真的被使用过,如果是的话那么它在哪里被使用?在哪些情况下?
正如标题所说,
一个典型的答案是:
允许任何和所有代码转换不会改变程序的可观察行为的规则
我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.
注意:将其标记为C和C++,因为它与两种语言都相关.
我想交换两个整数,我想知道这两个实现中的哪一个会更快:使用临时变量的显而易见的方法:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Run Code Online (Sandbox Code Playgroud)
或者我确定大多数人看过的xor版本:
void swap(int* a, int* b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
Run Code Online (Sandbox Code Playgroud)
看起来第一个使用额外的寄存器,但第二个使用三个加载和存储,而第一个只执行两个.有人能告诉我哪个更快,为什么?为什么更重要.
我已经了解到Xor操作可用于实现有效的交换功能.像这样:
template<class T>
void swap(T& a, T& b)
{
a = a^b;
b = a^b;
a = a^b;
}
Run Code Online (Sandbox Code Playgroud)
但是我可以在互联网上找到的交换实现基本上是这样的:
template<class T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
Run Code Online (Sandbox Code Playgroud)
似乎编译器没有为上面的两个表单生成相同的代码,因为我在VC++ 2010上测试了它,第一个更快地完成了工作(并且比std :: swap更快).第一个是便携式还是其他任何问题?随意纠正我的任何错误,因为我不是英语本地人,不擅长C++.