C++ clang array 比 clang vector 和 gcc vector 和 array 快得多

C++ clang array much faster than clang vector and both gcc vector and array

下面的代码显示了我的测试用例。我用 clang++ --std=c++11 -O2 和 g++ --std=c++11 -O2.

编译
long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
    ary[i] = i;

std::vector<long long> vec(100000000, 0);
for (long long i = 0; i < 100000000; ++i)
    vec[i] = i;

对于这两个,我只测试了初始化,然后是初始化和 for 循环。结果如下:

海湾合作委员会:

叮当声:

gcc 结果与向量与数组一样快的普遍看法相吻合。此外,vector 的 clang 和 gcc 结果非常一致。然而,clang 结果是荒谬的,阵列的执行速度要快得多。有人知道这是为什么吗?

25 倍的加速表示您的代码已优化。由于您的代码没有任何可见的内容,因此有资格被删除。您的基准无效。

此处的区别在于 clanggcc 如何处理优化对 new 的调用。以下代码:

long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
    ary[i] = i;

clang 将在 -O2 优化级别对其进行优化(see it live):

xorl    %eax, %eax
retq

gcc 不会 see it live:

 movl   0000000, %edi
 call   operator new[](unsigned long)
 leaq   800000000(%rax), %rcx
 movq   %rax, %rdx
.L2:
 movq   [=12=], (%rdx)
 addq   , %rdx
 cmpq   %rcx, %rdx
 jne    .L2
 xorl   %edx, %edx

问题是valid optimization or not? One could argue that by the as-if rule this is not a valid optimization since new can result in observable behavior

提案 N3664: Clarifying Memory Allocation but clang has includes this optimization from before this period, see this answer.

对 C++14 进行了有效优化