【问题标题】:What are gcc compiler optimizations?什么是 gcc 编译器优化?
【发布时间】:2020-07-24 01:22:30
【问题描述】:

我可以想到 3 种情况,编译器可以表示为 CSP,然后进行优化,但我不知道是否可以。我不假设特定的编译器优化标志,但是,为了确保优化,您可以假设给出 -O2 或 -O3 标志。

1) 如果在函数调用后不使用参数,则自己传递参数而不是复制

void aFunction(std::string aStr);
...
std::string aString = makeAString(anIntegerInput);
size_t mqSize = aString.size();
aFunction(aString); // or a class method like aClass->aFunction(aString);
std::cout << "Size : " << mqSize << std::endl

因为在 aFunction 调用之后不使用 aString。它可以从逻辑上推断,编译器不是复制 aString,而是移动字符串(aFunction 的签名不是字符串&& - 这里不是移动操作)? 将 aFunction 的输入参数设置为 std::string &&aStr 会强制吗?

2) 这里创建了一个带有默认构造函数的 T 对象,然后复制构造函数用于初始化 Map 的值。

template<typename T>
void aMethod(std::map<std::string, T>& p, const std::vector<std::string>& aVec) {
    p.clear();
    T t;
    for (auto it = aVec.begin(); it != aVec.end(); ++it) {
        p[*it] = t;
    }
}

编译器可以检测到“t”对象只是默认构造对象,而不是复制,可以使用默认构造函数初始化 p 映射的值。

3) 我们有一系列“theSameString”

std::map<std::string, int> temp{{"john", 5}, {"anna", 7}};
int aValue = temp.find("john");
int anotherValue = temp.find("john");
int yetAnotherValue = temp.find("john");

在这里,编译器是否创建 4 个不同的“john” const char* 数据结构,或者对于要创建的每个 const char*,检查以前的 const char* 数据结构? 谢谢,

【问题讨论】:

  • 我建议使用the godbolt site 来查看简单代码的实际组装。这是一个非常有用的网站!
  • 您想要一份编译器优化列表以及它们是如何实现的?那是一整本书。或者一个学期。
  • @bolov 我打算将问题和答案贡献给社区,可能对这 3 个问题的一个很好的答案将是相关的,并为我们提供编译器优化的概述 - 一个相对较少人有专业知识的主题。
  • 老实说,我不明白为什么这个问题被否决了,相反我觉得这个问题很有教养。

标签: c++ gcc compiler-optimization


【解决方案1】:

编译器不允许通过 move-constructor 调用更改复制构造函数调用,因为它必须遵循语言规则(请注意,如果方法通常具有预期语义,它们只是可能与预期语义不等价的常规方法(我看到一个矩阵类,其中operator++()operator++(int) 的行为非常不同,一个增加行,另一列增加,所以it++; 不能被++it; 替换以进行优化))。

在特定情况下,唯一允许的行为更改是copy/move (constructor) elision。从 C++14 new expression.

它可以做的是在as-if rule之后进行优化。因此任何不影响可观察行为的更改(I/O、易失性访问)。 “计时”不是可观察到的行为,我的意思是如果您打印代码的经过时间,它不会禁止优化该代码。

3.) 我们有一系列“theSameString”

编译器是允许的,但不是必须的。

  • "hello world" == "hello world" 可能会返回 truefalse
  • "hello world" + 6 == "world" 可能会返回 truefalse

(记住我们在这里比较的是指针,而不是内容)。

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多