首页 > 其他分享 >关于 O2

关于 O2

时间:2023-10-10 21:44:12浏览次数:35  
标签:code return int long 关于 inline O2

本文是关于 O2 带来的问题、以及本人因为 O2 出过的问题的一个整合。

O2 带来的问题

语义误用

inline 内联

如果开 O2,不手动写 inline 也是内联的;如果不开,手动写 inline 也是没什么卵用的。

register 虚假的寄存器建议

现代编译器会直接忽略你的 register 关键字。

你自己认为的寄存器分配一般没有编译器直接跑寄存器分配算法来的聪明

此关键字于 C++11 被弃用,于 C++17 被删除

代码修正

运算符优化

  • << 代替 *

    但是不能类似的用 >> 代替 /,因为编译器不能判断两个有符号的数的正负性。因为 / 2向零取整>> 1 是向下取整。
    举个例子,-7 / 2 = -3,但是 -7 >> 1 = -4

  • * 代替 /

  • + 代替 *

常量传播

如果一个表达式可以确定为常量,在它的下一个定义前,可以进行常量传播。例如:

int x = 1;
int y = x;  // x = 1, => y = 1
x = 3;
int z = 2 * y;   // z => 2 * y = 2 * 1 = 2
int y2 = x * 2;  // x = 3, => y2 = 6

在编译时可转化为:

int x = 1;
int y = 1;
x = 3;
int z = 2;
int y2 = 6;

无用代码删除

long long T_T() {
    long long a = 114514;
    long long b = a * 1919810;
    long long c = 1145;
    return c;
}

在编译时可转化为:

long long test() {
    return 1145;
}

这个例子不仅有 无用代码删除,还有 常量传播

关于循环

  • 循环替换

    do-while 外套 if 代替 for。(虽然不知道能快多少)

  • 循环不变量外提

  • 循环判断外提

    就是把 if 等分支结构放在 for 等的外面(虽然不知道能快多少)。

剩下的

还不太理解,直接参见原文献吧。

本人出现过的问题

关于函数

对于函数,我们必须要严格规范函数返回类型的使用。否则会 RE。举个例子:

// This is the wrong code(function).

inline int awa() {
    /* ... */
    // You have no returns in non-void functions.
    // In the older compiler, there's no wrong in this code(function).
    // But in the compiler now, this code(function) will tell you RE.
}
// These are the right codes(functions).

inline int qwq() {
    /* ... */
    return 114514;
    // You must have at least a return(except in the void functions), and this is right. 
}

inline void T_T() {
    // In the void functions, you must have no returns.
}

好了,今天是被 O2 坑害的一天。

关于不知道

还有一些厌氧 code,不吸氧就 AC,吸氧就 RE(这不分明是欠揍?),有可能是越界问题。

参考文献

  1. 编译优化 - OI Wiki

标签:code,return,int,long,关于,inline,O2
From: https://www.cnblogs.com/Chronologika/p/17755825.html

相关文章

  • Vue源码学习(十):关于dep和watcher使用的一些思考
    好家伙, 前面想了好久,都没想明白为什么要dep和watcher打配合才能实现数据-视图同步为什么要多一个依赖管理这样的东西给每个数据绑个watcher(xxfunction),然后,数据变了,调set,然后调xxfunction,不就行了,然后今天突然想明白了,不是为什么要这么干,而是必须这么干 来看......
  • 关于物料跑完生产订单发现BOM有错,更改物料
    1.查看当前生产订单是否已经生成领料申请,如有请删除2.在系统中选择已审核生产订单修改,如果未审核则可直接在生产订单中查询修改 3.在生产订单中选择子件进行修改,重新生成领料申请即可4.在选择子件后弹出窗口中修改子件即可。 ......
  • 关于科目为非末级科目处理,表现为科目余额表成倍增加
    1.在后台查询科目本来为非末级科目信息select*fromcode where ccodelike'%科目%'2.查看bend字段,如果为0是非末级,如果为1则为末级3.调整更新bend 字段,然后重新打开科目余额表即正常UPATEcode setbend=0where ccodelike'%1012%'......
  • 关于使用不同币种付款核销,在应付选择异币种核销
    1.在应付账款中,我们原来发票是美元,但我们实际付款为欧元,这里前是是已经做发票情况下。在做应付单时使用欧元做付款单2.在保存审核核销时我们可以选择异币种核销进行处理,系统会自动生成凭证及调汇凭证 ......
  • 关于Winform中使用DataGridView显示数据时,CheckBox选中状态异常问题
    使用C#创建的Winfrom项目,使用DataGridView显示数据,第一列中使用了DataGridViewCheckBoxColumn实现复选功能。但是当我绑定好数据后测试时,发现勾选和取消勾选的操作表现完全不按照预想的来——连续勾选几行后取消其中部分行的选中状态,再重复选中和取消时,原本不该被选中的checkBox......
  • 关于B站频繁登录
    情况描述近日观看B站(bilibili)网页端出现了一个新功能:当用户没有登录时,将对每个视频间隔性地(目前的情况是视频开始播放后的1分钟)进行自动暂停并弹出登录窗口。不得不说,这个功能使得使用体验极差,每个视频都要经历暂停和弹窗实在是让人不爽。如此行为真是恶心用户、严重降低用......
  • SAP ABAP 关于SMARTFORMS编辑文本出现WORD样式
    SAPABAP关于SMARTFORMS编辑文本出现WORD样式问题描述:SAPABAP关于SMARTFORMS编辑时文本默认使用WORD在使用smartforms打开编辑文本的时候会出现word样式,这样就会出现无法拖拽字段和系统默认信息情况,导致部分功能无法使用解决方案:通过SE38打开程序RSCPSETEDITOR将SAPscript......
  • 关于归并排序求逆序对
    之前写了一篇blog讲如何用归并排序求逆序对以及解决相关问题。最近才发现自己根本没搞懂,而且写的不好。遂重写。前言:什么是逆序对?对于数列的第i个和第j个元素,若满足i<j且a[i]>a[j],则其为一个逆序对。归并排序的过程:将序列分为两部分,先递归将两侧序列排序,后将两......
  • [JVM]关于swap的理解
    关于swap的理解概念swap就是内存交换的意思。计算机内存分为物理内存和虚拟内存。物理内存就是计算机实际内存的大小;虚拟内存是磁盘空间里开辟出一部分,是虚拟出来的内存空间,所以也叫磁盘缓存。虚拟内存使得计算机在内存不够的情况可以得到部分解决。程序运行的时候会在虚拟内......
  • 关于大顶堆和小顶堆习题的解决
    好吧,不得不承认的是,我之前对于堆的知识确实没理解,现在急用它,就急学!一般的习题的话,就是要求我们判断某个序列,是不是大顶堆或者小顶堆。小顶堆要求,k(i)≤k(2i)且k(i)≤k(2i+1)大顶堆要求,k(i)≥k(2i)且k(i)≥k(2i+1)就只需要这两个条件就能判断顶堆是否成立啦~~......