gpt4 book ai didi

c++ - 为什么 gcc 会产生这个奇怪的程序集 vs clang?

转载 作者:行者123 更新时间:2023-12-01 14:48:45 26 4
gpt4 key购买 nike

我试图找出 gcc 和 clang 之间的区别以及它们如何处理 std::vector .任何有更多知识的人都可以解释为什么 gcc 和 clang 会产生如此不同的输出?

gcc 9.2:https://godbolt.org/z/AFN46d
叮当 9.0:https://godbolt.org/z/kEkpWE

该程序:

#include <vector>

int foo(int a) {
auto vec = std::vector<int>{};
vec.push_back(1);
vec.push_back(2);
return vec[1] * a;
}
int main () {
return foo(5) + foo(4);
}

clang 产生非常容易理解的程序集。然而,gcc 产生了这个奇怪的东西:
void std::vector<int, std::allocator<int> >::_M_realloc_insert<int>(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int&&):
movabs rcx, 2305843009213693951
push r15
push r14
push r13
push r12
push rbp
push rbx
sub rsp, 24
mov r12, QWORD PTR [rdi+8]
mov r8, QWORD PTR [rdi]
mov rax, r12
sub rax, r8
sar rax, 2
cmp rax, rcx
je .L16
mov r15, rdx
mov rdx, rsi
mov rbp, rdi
mov r13, rsi
sub rdx, r8
test rax, rax
je .L11
movabs r14, 9223372036854775804
lea rsi, [rax+rax]
cmp rax, rsi
jbe .L17

这些神奇的数字从何而来?

最佳答案

GCC 试图保持安全并发出一些额外的检查。你看到的第一个常数仅仅是

__gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(int)

并构成 x86-64 上整数 vector 的最大可能大小。

第二个常数似乎只是
__gnu_cxx::__numeric_traits<ptrdiff_t>::__max

向下舍入可被 sizeof(int) 整除.

一般来说,那些东西来自各种 max_size() libstdc++ 中的方法。 clang 有可能证明一些检查是不必要的。

关于c++ - 为什么 gcc 会产生这个奇怪的程序集 vs clang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60244807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com