`std :: vector`迭代器生成巨大的汇编代码

时间:2015-03-27 21:33:37

标签: c++ vector visual-studio-2013 disassembly

在开始之前,我想说我正在使用Visual Studio 2013 Express Update 4并在(/ O2和/ Ot)上进行优化编译。

我正在使用vector这样的迭代器进行测试:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<char*> List = {"String 1", "String 2", "This is string 3"};

    for (auto it = List.begin(); it != List.end(); it++)
        cout << *it << endl;

    return 0;
}

然后查看了反汇编并看到了一些荒谬的大型汇编代码(仅for循环和cout约200行

然后我试着这样:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<char*> List = {"String 1", "String 2", "This is string 3"};

    for (auto i = 0U; i < List.size(); i++)
        cout << List[i] << endl;

    return 0;
}

然后,不可思议的代码变得非常小(大约55行)。

所以我的问题是:它应该是那样的,还是可能是编译器错误?访问vector内容的最正确,最快捷的方法是什么?

1 个答案:

答案 0 :(得分:3)

这是编译器实现质量与优化设置的关系。

关于使用“优化”进行编译的评论并没有多说。虽然一些优化设置涉及减少代码大小,但优化时常常关注其他度量,例如运行时速度甚至内存使用。例如,运行时速度的优化通常会折衷代码大小(例如汇编程序的数量)以实现性能 - 没有硬性和快速的规则要求,如果两位代码实现相同的输出,则速度越快越小。

编译器中错误的主要定义是编译/链接/执行代码时的结果的正确性(即,它在C ++标准定义的约束内产生结果)。如果您正在使用与最小化输出代码大小相关的优化设置,则关注的是编译器质量而非正确性。

关于应该使用什么方法来访问向量的元素,没有严格的规则 - 有用例。如果它们明确地达到所需效果(例如,没有表现出不确定的行为),则所有方法都是正确的。尽管存在对行为的约束,但是一些操作(例如,通过索引访问元素是恒定时间操作),大多数有用的程序使用许多操作,并且交互在库的实现之间变化。因此,如果这些事情非常重要,您需要测试并选择符合您要求的那个。

如果您使用的是与最小化代码大小有关的优化设置,则可能存在可报告的错误。对供应商而言至关重要的数量(在您的情况下为微软)归结为他们认为这种优化类型对其付费客户群的重要程度。

在实践中,我很少会担心编译器发出的代码的大小,除非存储空间非常宝贵。首先可靠,正确地运行代码,然后担心是否可以减少可执行文件的大小。可执行文件很小但不能按要求运行并不是特别有用。