【发布时间】: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