这是测试代码.
元组测试:
using namespace std;
int main(){
vector<tuple<int,int>> v;
for (int var = 0; var < 100000000; ++var) {
v.push_back(make_tuple(var, var));
}
}
Run Code Online (Sandbox Code Playgroud)
配对测试:
#include <vector>
using namespace std;
int main(){
vector<pair<int,int>> v;
for (int var = 0; var < 100000000; ++var) {
v.push_back(make_pair(var, var));
}
}
Run Code Online (Sandbox Code Playgroud)
我通过Linux time命令进行了时间测量.结果是:
| | -O0 | -O2 |
|:------|:-------:|:--------:|
| Pair | 8.9 s | 1.60 s |
| Tuple | 19.8 s | 1.96 s |
Run Code Online (Sandbox Code Playgroud)
我想知道,为什么O0中的这两个数据结构之间存在如此大的差异,因为它们应该非常相似.02中只有一点不同.
为什么O0的差异如此之大,为什么会有任何差异呢?
编辑:
v.resize()的代码
对:
#include …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
#include <utility>
#include <tuple>
std::pair<int, int> f1()
{
return std::make_pair(0x111, 0x222);
}
std::tuple<int, int> f2()
{
return std::make_tuple(0x111, 0x222);
}
Run Code Online (Sandbox Code Playgroud)
Clang 3和4在x86-64上生成类似的代码:
f1():
movabs rax,0x22200000111
ret
f2():
movabs rax,0x11100000222 ; opposite packing order, not important
ret
Run Code Online (Sandbox Code Playgroud)
但是Clang 5生成了不同的代码f2():
f2():
movabs rax,0x11100000222
mov QWORD PTR [rdi],rax
mov rax,rdi
ret
Run Code Online (Sandbox Code Playgroud)
正如GCC 4至GCC 7一样:
f2():
movabs rdx,0x11100000222
mov rax,rdi
mov QWORD PTR [rdi],rdx ; GCC 4-6 use 2 DWORD stores
ret
Run Code Online (Sandbox Code Playgroud)
返回std::tuple适合单个寄存器的生成代码为什么会更糟std::pair?看起来特别奇怪,因为Clang 3和4似乎是最优的,而5则不是.
在这里试试:https: …