前言

写的很乱,各种内容都有。仅仅是为了记录一下

而且内容极其不严谨(没错,只有实践,没有理论)!请各位谨慎驾驶!

强制内联

#define Inline __inline__ __attribute__((always_inline))

本地测试结果:

  • 开O2之后inline和Inline加不加没啥用

  • 不开O2时inline可能会有负优化,而Inline会让程序快很多

当然也可以强制不inline

直接在函数名前加

__attribute__((noinline))

利用位运算实现大小写转化

可以这么写

char ToUpper(char a) {return (a >= 'a' && a <= 'z') ? a ^ ' ' : a;}

实测比c++内置的toupper快6倍。。

enum类型

这玩意儿叫“枚举”

格式如下:

enum [enumeration name] {enumerator1[=value1], enumerator2[=value2], ...};

其中,第二个变量的取值默认是第一个变量取值+1,第一个默认是0,当然也可以自己设定

一个简单的栗子

enum NOIP {a, b, c, d = 22};
cout << c << " " << d;

将会输出2 22

自定义输入输出流

这部分有点硬核啊。。

一个简单的栗子是这样的

#include<bits/stdc++.h>
using namespace std;
class Pair {
private:
int id;
string s;
public:
friend ostream& operator << (ostream& os, Pair& a) {
os << a.s << ":" << a.id << "\n";
return os;
}
friend istream& operator >> (istream& is, Pair& a) {
is >> a.s >> a.id;
return is;
}
};
int main( ) {
Pair a;
cin >> a;
cout << a;
return 0;
}
//input: abc 123
//output : abc:123

注意这里我们实际上还是在用cin / cout输入输出

输入输出流在OI中常常应用于输入输出优化。

struct InputOutputStream {
enum { SIZE = 1000001 };
char ibuf[SIZE], *s, *t, obuf[SIZE], *oh; InputOutputStream() : s(), t(), oh(obuf) {}
~InputOutputStream() { fwrite(obuf, 1, oh - obuf, stdout); } inline char read() {
if (s == t) t = (s = ibuf) + fread(ibuf, 1, SIZE, stdin);
return s == t ? -1 : *s++;
} template <typename T>
inline InputOutputStream &operator>>(T &x) {
static char c;
static bool iosig;
for (c = read(), iosig = false; !isdigit(c); c = read()) {
if (c == -1) return *this;
iosig |= c == '-';
}
for (x = 0; isdigit(c); c = read()) x = x * 10 + (c ^ '0');
if (iosig) x = -x;
return *this;
} inline void print(char c) {
if (oh == obuf + SIZE) {
fwrite(obuf, 1, SIZE, stdout);
oh = obuf;
}
*oh++ = c;
} template <typename T>
inline void print(T x) {
static int buf[23], cnt;
if (x != 0) {
if (x < 0) print('-'), x = -x;
for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 | 48;
while (cnt) print((char)buf[cnt--]);
} else print('0');
} template <typename T>
inline InputOutputStream &operator<<(const T &x) {
print(x);
return *this;
}
} io;

template

template,中文名:模板

分为两类,一种叫类模板,一种叫函数模板

类模板我用的不多

函数模板用的多一些

下面是一个求最大值的模板,c++的标准库中也是这么实现的,因此同时存在的话会引起CE

template <typename T>
inline T const& max(T const &a, T const &b) {
return a > b ? a : b;
}

如果直接调用的话,当\(a, b\)的类型不同时会引起CE。

这时可以直接强制类型转化

	int a = 1e9;
long long b = 1e18;
long long c = max<int>(a, b);
//the output is 1e9 int a = 1e9;
long long b = 1e18;
long long c = max<long long>(a, b);
//the output is 1e18

预编译黑科技

第一条是强制开栈空间

后面的并不清楚在干啥,貌似可以强制\(O_2\)

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

__builtin系列

  • __builtin_popcount(unsigned int n)

计算\(n\)的二进制表示中有多少个1

  • __builtin_parity(unsigned int n)

判断\(n\)的二进制表示中1的个数奇偶性(要你何用?)

  • __builtin_ffs(unsigned int n)

判断\(n\)的二进制末尾最后一个1的位置,从1开始

  • __builtin_ctz(unsigned int n)

判断\(n\)的二进制末尾\(0\)的个数

  • __builtin_clz(unsigned int n)

判断\(n\)的二进制前导0的个数

指针的骚操作

通过指针实现负下标数组

#include<bits/stdc++.h>
using namespace std;
int main() {
int __a[21];
for(int i = 0; i <= 20; i++) __a[i] = i;
int *const a = &__a[10];
printf("%d %d %d", a[7], a[0], a[-7]);
}

C++语法小技巧的更多相关文章

  1. How Javascript works (Javascript工作原理) (十四) 解析,语法抽象树及最小化解析时间的 5 条小技巧

    个人总结:读完这篇文章需要15分钟,文章介绍了抽象语法树与js引擎解析这些语法树的过程,提到了懒解析——即转换为AST的过程中不直接进入函数体解析,当这个函数体需要执行的时候才进行相应转换.(因为有的 ...

  2. JavaScript中if语句优化和部分语法糖小技巧推荐

    前言 在前端日常开发过程中,if else判断语句使用的次数应该是比较频繁的了,一些较为复杂的场景,可能会用到很多判断,在某个代码块使用很多if else时,代码会显得较为冗余,阅读起来不够清晰. 除 ...

  3. Windows Azure一些小技巧集合

    我最近做了一个Windows Azure上面的项目,自己在做的过程中遇到了很多问题.有的是我自己摸索解决,有的是到网上寻找零碎的信息结合起来解决的.我感觉应当把某些解决方法集中一下,方便我以后查阅,也 ...

  4. 客户端JS性能的一些优化的小技巧

    下面是一些关于客户端JS性能的一些优化的小技巧:1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;). while().for(in).在这三种循环中 for(in) ...

  5. 一些Python的惯用法和小技巧:Pythonic

    Pythonic其实是个模糊的含义,没有确定的解释.网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯.本文主要是说明一些Python的惯用法和小技 ...

  6. Win10 UWP开发中的重复性静态UI绘制小技巧 1

    介绍 在Windows 10 UWP界面实现的过程中,有时会遇到一些重复性的.静态的界面设计.比如:画许多等距的线条,画一圈时钟型的刻度线,同特别的策略排布元素,等等. 读者可能觉得这些需求十分简单, ...

  7. ( 译、持续更新 ) JavaScript 上分小技巧(三)

    最近家里杂事较多,自学时间实在少的可怜,所以都在空闲时间看看老外写的内容,学习之外顺便翻译分享~等学习的时间充足些再写写自己的一些学习内容和知识点分析(最近有在接触的:复习(C#,SQL).(学习)T ...

  8. ( 译、持续更新 ) JavaScript 上分小技巧(一)

    感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...

  9. Nginx return 关键字配置小技巧

    Nginx的return关键字属于HttpRewriteModule模块: 语法:return http状态码 默认值:无 上下文:server,location,if 该指令将结束执行直接返回htt ...

随机推荐

  1. java小练习

    打印99乘法表 因为有9行9列,所有要用两个for循环 int m; for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) ...

  2. Redis的7个应用场景

    一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了 ...

  3. 怎么使用zepto.js的tap事件引起的探索

    前言:   在使用zepto.js之前,你首先要知道它是什么?为什么要使用它?以及它和jquery有什么区别? ①:简单来说zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与j ...

  4. Linux 下源码编译FFMEG

    目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...

  5. LongAdder 测试

    import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.util.concurrent.CountDownLatch;i ...

  6. windows服务器解决挖矿程序问题

    前几天发现服务器报警,cpu使用率已达100%,查资料知道正是最近比较流行的挖矿程序在捣鬼.我们使用的是阿里云的服务器,操作系统是windows server.网上有大量的资料讲如何处理,我把自己处理 ...

  7. [Abp 源码分析]十六、后台作业与后台工作者

    0. 简介 在某些时候我们可能会需要执行后台任务,或者是执行一些周期性的任务.比如说可能每隔 1 个小时要清除某个临时文件夹内的数据,可能用户会要针对某一个用户群来群发一组短信.前面这些就是典型的应用 ...

  8. BBS论坛(十六)

    16.登录功能完成 (1)front/forms.py class SigninForm(BaseForm): telephone = StringField(validators=[Regexp(r ...

  9. .Net 调用中国气象台Web Service

    接口地址http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 调用步骤:项目添加服务引用-高级-添加web引用 简单代码: web服务 ...

  10. qt之窗口换肤

    1.相关文章 Qt 资源系统qt的moc,uic,rcc命令的使用 2.概要    毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08.10.13等开发工具,并安装了qt的插件,最近在做客户 ...