ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基本卡常

2022-08-08 13:04:45  阅读:177  来源: 互联网

标签:基本 GCC falign functions O2 pragma 卡常 optimize


本文将会持续更新

卡时间

预处理指令和编译

O2

O2 是最常见的一种优化,基本来说有两种使用方式,第一种是在编译时加上-o2选项,例如编译a.cpp时,使用 O2 。

g++ a.cpp -o a.exe -o2

即可。

第二种方法是在预处理指令中添加 O2 ,即在代码首行添加如下指令:

#pragma GCC optimize(2)

火车头

火车头也是 C++ 中一种比较常见的优化方式,基本应用于离线评测。

火车头比较长,就不一个一个解释了,直接放代码。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")

位运算

关于位运算,如果想了解得更详细,可以看一下https://www.luogu.com.cn/blog/2021wuyueyang/qian-tan-wei-yun-suan1https://www.luogu.com.cn/blog/2021wuyueyang/qian-tan-wei-yun-suan2

定义

位运算就是直接对整数在内存中的二进制位进行操作。

对乘法、除法的加速

首先了解a>>x等价于 \(\frac{a}{2^{x}}\) 和a<<x等价于 \(a \times 2^{x}\) 。

于是我们可以在一些除法、乘法计算量比较大的题目中使用位运算加速。

例如以下题目:

给你 $ n (n \leq 10^{5}) $ 个数,进行 $ m (m \leq 10^{3}) $ 次操作,每次操作会让每个数乘上 \(2^{x}\) , \(x\) 输入 ,保证不会溢出。

相信大多数 OIer 都能写出以下代码:

for(int i=1;i<=m;++i) {
    scanf("%d",&x);
    int p=pow(2,x);//pow是快速幂
    for(int j=1;j<=n;++j) {
        a[j]*=x;
        printf("%d ",a[j]);
    }
    printf("\n");
}

但是这种算法效率不佳,于是我们可以做一些优化,如下:

for(int i=1;i<=m;++i) {
    scanf("%d",&x);
    for(int j=1;j<=n;++j) {
        a[j]<<=x;
        printf("%d ",a[j]);
    }
    printf("\n");
}

其效率远远高于前一种算法,同时可以使代码简洁一些。

卡空间

标签:基本,GCC,falign,functions,O2,pragma,卡常,optimize
来源: https://www.cnblogs.com/shuger/p/16561422.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有