对于此简单功能,为什么编译器输出如此不同
Why are compiler outputs so different for this simple function?
我要求C 编译器生成一个机器编码的函数,该功能总和const std::vector
的元素。
#include <vector>
int sum(const std::vector<int>& v)
{
int s = 0;
for(const auto e:v) s += e;
return s;
}
我用-O2
询问编译器X86_64 GCC 7.2。它只是说:
sum(std::vector<int, std::allocator<int> > const&):
mov rdx, QWORD PTR [rdi]
mov rcx, QWORD PTR [rdi+8]
xor eax, eax
cmp rdx, rcx
je .L4
.L3:
add eax, DWORD PTR [rdx]
add rdx, 4
cmp rdx, rcx
jne .L3
rep ret
.L4:
rep ret
我对-O1
,-O2
和-O3
的编译器Clang 4.0.0提出了同样的要求。出色地!那是一篇完整的文章。它只是操纵他在-O1
,-O2
和-O3
的文章中的一些形容词。
类似的情况与X86_64 ICC 17一起使用-O2
,X86_64 Cl 19。
我返回使用-O3
的编译器X86_64 GCC 7.2。X86_64 GCC 7.2现在提供冗长的输出。
我认为您的问题是:
为什么如此简单的事情生成了这么多代码?
答案很长,但会像这样:
当我们操纵内存时,现代记忆体系结构实现了更多的吞吐量...
- 在块中
- 并行
- 在给定硬件有效的内存地址边界上。
因此,编译器试图通过考虑内存体系结构的特征来尽可能通过向量/平行操作来优化长向量的情况。
,但并非所有向量都是可以有效处理为块的项目数量的倍数。
因此,向量的开始和结尾分别处理特定的操作,而a(长)向量的大部分是由中间的巧妙矢量代码处理的。
相关文章:
- C++编译器命令 C++ 不会生成输出
- 编译器资源管理器和 GCC 具有不同的输出
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- 我不明白我的编译器是如何获得此输出的
- C++编译器只显示数字,不显示正确的输出
- 乘以时输出错误.这是我编译器中的错误吗?C
- Web 编译器输出奇怪的结果
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 编译器将输出的流运算符<<解释为用于按位左移的二进制运算符<<
- 构建 C/C++ 代码时的 Gradle 编译器输出
- C 编译器输出由于Permisson误差而未运行
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- VS说"Too few arguments...",但其他编译器给了我正确的输出?
- GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
- 以下代码的输出是什么(答案因差异编译器而异)
- 简单构造函数的复杂编译器输出
- C++程序中的输出编译器版本
- 最后的所有输出——c++编译器