无论何时使用带括号的初始化,自动盲搜索和替换所有类型声明都可能令人头痛:
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的第一个声明被正确地推断为对接受两个整数的构造函数的调用。但是自动变量q搜索需要std::initializer\u list
你的问题标题指定了“性能”。
auto
是一种编译时构造,允许用推断类型替换自身。它的使用不会导致不同的机器指令,如果你手写了它推断出的类型名称。
问题在于,在管理性能时,类型规范和类型转换通常是至关重要的,而auto
可以隐藏导致程序员说出与预期不同的内容:
std::vector<std::array<BigStruct, 10000>>& f();
auto va = f(); // copy
for (auto v: va) { // copies
// ...
}
如果程序员编写了:
std::vector<std::array<BigStruct, 10000>> va = f();
或者
for (std::array<BigStruct, 10000> v : va)
他们会意识到他们是按价值指定的。但是d::a
人们掉以轻心,忘记了auto
推断类型,它不包括ref限定。
auto& va = f(); // reference
for (auto& v : va) { // references
这里存在性能影响,但这不是由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
时,变量声明初始化行没有转换。但是,如果这种转换无论如何都必须发生,那么最好在初始化期间发生一次,而不是在以后多次。
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
与延迟计算相结合时,这种延迟转换可能会破坏代码(真实世界示例1,示例2):
class Matrix { ... };
class MatrixExpression {
...
operator Matrix() const;
};
MatrixExpression operator+(const Matrix& a, const Matrix& b);
std::ostream& operator(std::ostream& out, const Matrix& m);
Matrix a = ...;
Matrix b = ...;
auto c = a + b; // evaluation of the matrix addition doesn't happen here
a[0][0] += 1;
std::cout << c; // matrix addition is evaluated here, using the new state of 'a'
我明白为什么C 11中的类型提高了正确性和可运维性。我读到它也可以提高性能(赫伯·萨特的《几乎总是自动》),但我错过了一个很好的解释。 如何提高性能
问题内容: 我已经用Python编写了一个工作程序,该程序基本上可以解析一批二进制文件,然后将数据提取到数据结构中。每个文件大约需要一秒钟的时间来解析,这意味着数千个文件要花费数小时。我已经成功实现了线程解析的线程版本的批处理解析方法。我在100个具有不同线程数的文件上测试了该方法,并对每次运行进行了计时。结果如下(0个线程是指我的原始,预线程化代码,1个线程是指生成一个线程的新版本)。 尽管生成
通常情况下,Java源代码是向前兼容的。在Java8之前,据我所知,编译的类和源代码都与后来的JDK/JVM版本实现了前向兼容。[更新:这不正确,请参阅下面的注释re'enum'等。]但是,在Java8中添加了缺省方法之后,情况似乎不再是这样了。 例如,我一直使用的库有一个的实现,它包括一个。此方法返回已排序列表内容的副本。这个库作为jar文件依赖项部署,在使用JDK1.8构建的项目中运行良好。
Hi有类似的错误,如重复条目。 失败:构建失败,但有一个异常。 > Java语言util。拉链ZipException:重复条目:android/support/annotation/AttrRes。班 尝试:使用--stacktrac选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。 生成失败 总时间:1分钟46.13秒 有人能告诉我如何在jar文件中找到重复的
以下代码是竞赛中问题陈述的解决方案。给出的时间限制为1s。该代码在5/7个测试用例中正常工作。对于其他情况,超过了时间限制。如何降低下面代码的时间复杂度? 编辑:问题陈述被定义为返回数字n的值或n/2、n/3、n/4之和,以最大值为准。例如,如果输入为24,则可以进一步减少或交换为12 8 6=26,12可以减少为6 4 3=13。8和6不应减少,因为这可能会降低值。最后的答案是13 8 6=27
新的d3和修复错误。我正在使用d3库处理一个js文件。以下代码行在v5.16中不会出错: 但是,当迁移到v6时。6.2及以上,我得到一个错误。我得到的错误是在线的:出现以下错误:。 错误的起源,根据https://github.com/d3/d3/releases/tag/v6.0.0,v6.0.0已经删除了。(d3.event在v6中未定义)。有人能帮助建议我在迁移到