C++ 可以使用C++;11';s';自动';降低性能甚至破坏代码?
此问题与现有问题“”相反 对这个问题的回答表明,使用C++ 可以使用C++;11';s';自动';降低性能甚至破坏代码?,c++,c++11,lazy-evaluation,auto,C++,C++11,Lazy Evaluation,Auto,此问题与现有问题“”相反 对这个问题的回答表明,使用auto不仅会产生积极的影响,还会产生消极的影响 我认为我们需要一个单独的问题,答案集中在auto和auto之间,变量声明+初始化行没有转换。但是,如果这种转换无论如何都必须发生,那么最好在初始化期间发生一次,而不是在以后多次 struct X { ... }; struct Y { operator X() const; ... }; Y foo(); // maybe, originally its return
auto
不仅会产生积极的影响,还会产生消极的影响
我认为我们需要一个单独的问题,答案集中在
auto
和auto
之间,变量声明+初始化行没有转换。但是,如果这种转换无论如何都必须发生,那么最好在初始化期间发生一次,而不是在以后多次
struct X {
...
};
struct Y {
operator X() const;
...
};
Y foo(); // maybe, originally its return type was X but later was changed to Y
void bar(const X& );
const auto x = foo(); // <-- conversion not happening here
//
for ( int i = 0; i < 100; ++i ) //
bar(x); // <-- silently rages here
您的问题标题指定了“性能”
auto
是一种编译时构造,允许用推断类型替换自身。它的使用不会导致不同的机器指令,如果你手写了它推断出的类型名称
问题在于,在管理性能时,类型规范和类型转换通常是至关重要的,而auto
可以隐藏导致程序员说出与预期不同的内容:
std::vector<std::array<BigStruct, 10000>>& f();
auto va = f(); // copy
for (auto v: va) { // copies
// ...
}
这里存在性能影响,但这不是由auto
引起的,而是(意外地)显式指定副本的副作用
auto
并不意味着与此相同
它意味着此
的一个实例
auto va = f(); // an instance-of what f returns, thus a copy.
auto& va = f(); // a reference to an instance-of, thus by reference.
无论何时使用带括号的初始化,通过auto盲目搜索和替换所有类型声明都会令人头痛:
class Point
{
public:
Point (int x1, int y1) { x = x1; y = y1; }
private:
int x, y;
};
int main()
{
Point p{5, 6};
auto q{5, 6}; // Error. Uniform initialization is not REALLY uniform
}
变量p的第一个声明被正确地推导为对接受两个整数的构造函数的调用。但是auto变量q搜索需要std::initializer\u list
的构造函数,因此无法编译 无意识地用auto
搜索并替换所有变量声明符几乎肯定会破坏代码。考虑cv
和ref限定符。普通的auto
通常与cv
或ref-qualifiedauto
不同。。。。考虑一下auto
不会影响重载解析和模板实例化的转换<代码>长x=1;库特
for (std::array<BigStruct, 10000> v : va)
auto& va = f(); // reference
for (auto& v : va) { // references
auto va = f(); // an instance-of what f returns, thus a copy.
auto& va = f(); // a reference to an instance-of, thus by reference.
class Point
{
public:
Point (int x1, int y1) { x = x1; y = y1; }
private:
int x, y;
};
int main()
{
Point p{5, 6};
auto q{5, 6}; // Error. Uniform initialization is not REALLY uniform
}