gpt4 book ai didi

c++ - clang无限尾递归优化

转载 作者:行者123 更新时间:2023-11-30 00:35:37 25 4
gpt4 key购买 nike

#include <iostream> 

int foo(int i){
return foo(i + 1);
}

int main(int argc,char * argv[]){
if(argc != 2){
return 1;
}
std::cout << foo(std::atoi(argv[1])) << std::endl;
}

% clang++ -O2 test.cc

% 时间 ./a.out 42

1490723512

./a.out 42 0.00s 用户 0.00s 系统 69% cpu 0.004 总计

% 时间 ./a.out 42

1564058296

./a.out 42 0.00s 用户 0.00s 系统 56% cpu 0.006 总计

% g++ -O2 测试.cc

% ./a.out 42 #infinte 递归

^C

% clang++ --version 
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
% g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

那么这是 Clang++ 的错误还是特性?

最佳答案

虽然 g++ 和 clang++ 都能够编译 C++98 和 C++11 代码,但 clang++ 从一开始就被设计为 C++11 编译器,并且在其 DNA 中嵌入了一些 C++11 行为(因此说话)。

在 C++11 中,C++ 标准成为线程感知的,这意味着现在有一些特定的线程行为。特别是 1.10/24 状态:

The implementation may assume that any thread will eventually do one of the following:

— terminate,

— make a call to a library I/O function,

— access or modify a volatile object, or

— perform a synchronization operation or an atomic operation.

[Note: This is intended to allow compiler transformations such as removal of empty loops, even when termination cannot be proven. — end note ]

这正是 clang++ 在优化时所做的。它发现该函数没有副作用并删除它即使它没有终止。

关于c++ - clang无限尾递归优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18478078/

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