当前位置: 首页 > 知识库问答 >
问题:

使用C 11的“自动”会降低性能甚至破坏代码吗?

东方高洁
2023-03-14

这个问题与现有的问题“使用C11的‘自动’能提高性能吗?”

这个问题的一个答案表明,使用自动不仅会有积极的影响,也会有消极的影响。

我认为我们需要一个单独的问题,答案集中在自动的那一面。

共有3个答案

夏侯星洲
2023-03-14

无论何时使用带括号的初始化,自动盲搜索和替换所有类型声明都可能令人头痛:

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

郎聪
2023-03-14

你的问题标题指定了“性能”。

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.

石思淼
2023-03-14

使用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中未定义)。有人能帮助建议我在迁移到