一个关于O2优化的疑惑:有无O2分数不一(没O2#5RE)

P2367 语文成绩

lrq090403 @ 2022-05-21 15:42:19

here

前面四份代码除注释与变量名之外其他的完全一样,但O2与无O2差别很大,希望有人来解释一下,谢谢orz

O2:100分,27~28ms;无O2:80分,21~22ms(#5RE).


by lrq090403 @ 2022-05-21 15:43:16

代码:

#include<cstdio>
inline int s(){
    char c='a';
    while((c>'9'||c<'0')&&c!='-')c=getchar();
    int ans=0,f=1;
    while(1){
        if(c=='-')f=-f;
        else if(c<='9'&&c>='0')ans=ans*10+c-'0';
        else break;
        c=getchar();
    }
    return f*ans;
}
int a,b,i,x,k[505050],cf,mi;
int main(){
    for(a=s(),b=s();i<a;++i)k[i]=s()-cf,cf+=k[i];
    for(;b;--b){
        i=s(),cf=s(),x=s();
        k[i-1]+=x,k[cf]-=x;
    }
    for(mi=k[0],i=1;i<a;++i)k[i]+=k[i-1],mi=(k[i]<mi?k[i]:mi);
    if(mi<1)mi=1;
    return(printf("%d",mi)&0);
}

by StillEmpty @ 2022-05-21 15:45:43

Undefined Behavior 导致的


by wutiruo @ 2022-05-21 15:45:47

@lrq090403 O2实际上是编译器在编译代码时内部修改了代码来优化,因而可能导致程序没有想预期的运行


by lrq090403 @ 2022-05-21 15:47:16

谢谢神犇们的帮助,此帖完结。


by lrq090403 @ 2022-05-21 15:48:40

此外我好像找到了RE的真正原因: k数组开的5e5


|