C++ GCC优化忽略循环条件

C++ GCC优化忽略循环条件,c++,c++11,gcc,C++,C++11,Gcc,所以我写了这段代码: #包括 常量表达式 整数斐波那契(整数n){ int a=0; int b=1; 用于(自动i=0;i

所以我写了这段代码:

#包括
常量表达式
整数斐波那契(整数n){
int a=0;
int b=1;
用于(自动i=0;ix[i]
调用未定义的行为

再分配一个以避免超出范围的访问

换句话说,

    constexpr auto x = array<10, fibonacci>();
constexpr auto x=array();
应该是

    constexpr auto x = array<11, fibonacci>();
constexpr auto x=array();
定义常量以避免输入错误更好:

int main() {
    constexpr int num = 11;
    constexpr auto x = array<num, fibonacci>();

    for (int i = 0; i < num; i++) {
        std::cout << i << " " << x[i] << std::endl;
    }
}
intmain(){
constexpr int num=11;
constexpr auto x=array();
for(int i=0;ix[i]
调用未定义的行为

再分配一个以避免超出范围的访问

换句话说,

    constexpr auto x = array<10, fibonacci>();
constexpr auto x=array();
应该是

    constexpr auto x = array<11, fibonacci>();
constexpr auto x=array();
定义常量以避免输入错误更好:

int main() {
    constexpr int num = 11;
    constexpr auto x = array<num, fibonacci>();

    for (int i = 0; i < num; i++) {
        std::cout << i << " " << x[i] << std::endl;
    }
}
intmain(){
constexpr int num=11;
constexpr auto x=array();
for(int i=0;i
对于(int i=0;i<10;i++){

修复检查索引

对于(int i=0;i<10;i++){


索引越界是UB。在不同的优化级别获得不同的结果是UB的一个完全合理的结果。我被
array
弄糊涂了。我认为它应该是
std::array
。如果
I>=10
,那么您有未定义的行为。编译器可以注意到这一点,并假设
I<10
总是正确的。有了这个假设,
i<11
就是
true
。为什么它会做出这样的假设呢?速度。它需要测试的事情越少。程序需要做的越少,速度就越快。你的代码不是计算机要执行的指令列表。它是对行为的描述。编译器的我们的任务是采取这种行为并生成指令列表。优化级别越高,编译器将花费越多的时间来寻找更快的方法来生成所描述的行为,并且它将做任何它想让您的代码在不改变行为的情况下变快的事情。如果您描述的行为有点错误。。。索引越界是UB。在不同的优化级别获得不同的结果是UB的一个完全合理的结果。我被
array
弄糊涂了。我认为它应该是
std::array
。如果
I>=10
,那么您有未定义的行为。编译器可以注意到这一点,并假设
I<10
总是正确的。有了这个假设,
i<11
就是
true
。为什么它会做出这样的假设呢?速度。它需要测试的事情越少。程序需要做的越少,速度就越快。你的代码不是计算机要执行的指令列表。它是对行为的描述。编译器的我们的任务是采取这种行为并生成指令列表。优化级别越高,编译器将花费越多的时间来寻找更快的方法来生成所描述的行为,并且它将做任何它想让您的代码在不改变行为的情况下变快的事情。如果您描述的行为有点错误。。。