inline

C++ | inline关键字和内联函数

半城伤御伤魂 提交于 2020-03-17 05:00:18
inline关键字 作用:避免频繁调用函数对栈内存重复开辟所带来的消耗。 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 内联函数 C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。 要点(Tips) 在内联函数内不允许使用循环语句和开关语句,并且不能内联函数本身不能是直接递归函数; 内联函数的定义必须出现在内联函数第一次调用之前; 类结构中所在的类说明内部定义的函数是内联函数。 inline仅是一个对编译器的建议; 建议 inline 函数的定义放在头文件中; 关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用;

树点涂色

混江龙づ霸主 提交于 2020-03-16 01:35:06
Solution 注意到题目中有一个非常引人注目的描述: 开始时每个点的颜色都不同; 每次涂的颜色也与之前的不同. 考虑用LCT来维护答案, 每条实边表示两个点有同种颜色; 每条虚边表示两个点有不同种颜色, 那么一条边到根路径上的不同颜色数量就等于向上走时经过的虚边数量 + 1, 因而操作2的处理就显而易见了. 注意到我们还有操作3的子树查询, 考虑到整棵树的形态在操作中并不会发生改变, 因此我们用DFS序 + 线段树维护每个点到根路径上的虚边数量, 每次操作1时access一个点并对路径上的点的子树在线段树中修改即可. #include <cstdio> #include <cctype> #include <vector> #include <algorithm> #include <cstring> #define vector std::vector #define max std::max #define swap std::swap namespace Zeonfai { inline int getInt() { int a = 0, sgn = 1; char c; while(! isdigit(c = getchar())) if(c == '-') sgn *= -1; while(isdigit(c)) a = a * 10 + c - '0', c =

shit!Vxworks!Shit!WorkBench!

空扰寡人 提交于 2020-03-15 05:07:12
郁闷的一周,一周的郁闷! Fuck the Vxworks! Fuck the WorkBench! 终于在注释掉报错的几行代码后,不管三七二十一,先编译通过了.但是走到这一步,弯路走了不少. 记录下来,以儆效尤!下周再解决这几个编译错误,抑或是不解决? 1. 安装workbench 3.2的时候没有使用同一目录下的licence,安装不成功.安装成功后,用开发组给的2个label竟然想编译! 2. 拿到了一个config spec!然后是按照Vxworks 6.5的方法在Vxworks6.8环境下编译,结果报错.于是删掉project文件,结果删除project文件的时候,选择了同时删除workspace下的文件(脑子进水了!),但是workspace下文件是在clearcase里的。于是在下次import project的时候,出现了project无法编译的现象,其实是check out的project文件被删除了。于是在clear case里只能看到这个被check out了,但是找不到这个文件!更搞笑的是,当天从同事那里得知信息,这个应该是clearcase的问题,找CM解决。 3. 周末加班,在热心同事的帮助下,才意识到是check out的文件被删除了(其实自己已经意识到了,奶奶的,这个现象和unix下clearcase的现象是一样的啊,cleartool ls

「模板」替罪羊树

扶醉桌前 提交于 2020-03-14 11:15:17
目录 变量/函数の定义 代码 变量/函数の定义 变量/函数名 定义/作用 tax[] 将树拍扁时用的临时数组 tail 与 tax[] 配套使用,类似于栈顶指针 son[x][] 点 \(x\) 在树上的左/右儿子 exist[x] 点 \(x\) 存在与否, \(1\) 为存在 val[x] 点 \(x\) 的值 siz[x] 点 \(x\) 的子树一共有多少节点 fact[x] 点 \(x\) 的子树实际还存在多少节点 rt 树根 memory_pool[] 内存池 origami 记录内存池的元素个数,也用作栈顶指针 真不是折纸大师 void buildPool() 建立内存池 int Newnode() 获取一个新节点编号 void Release(x) 释放节点 \(x\) ,即重新放回内存池 void Clear(x) 将点 \(x\) 清空 void Leaf(x) 建立点 \(x\) 为叶子的信息,双儿子为 \(0\) 且子树大小为 \(1\) void Pushup(x) 顾名思义,上传操作 bool Balance(x) 返回树 \(x\) 平衡与否, \(1\) 为平衡 void Insert(x,v) 在点 \(x\) 的子树里面插入值 \(v\) void Delete(x,rnk) 在点 \(x\) 的子树里面删除排名为 \(rnk\) 的值 int

【洛谷 P5422】【USACO19OPEN】Compound Escape P(轮廓线dp / 最小表示法)

岁酱吖の 提交于 2020-03-12 03:48:21
传送门 首先看数据范围和题就知道是轮廓线 d p dp d p 最小表示法压连通性 但是由于脑残 还是 w a + t l e wa+tle w a + t l e 了 把每次转移的预处理出来 每次可以直接枚举 2 k 2^k 2 k 横边情况和 2 k − 1 2^{k-1} 2 k − 1 竖边情况转移 # include <bits/stdc++.h> using namespace std ; # define cs const # define re register # define pb push_back # define pii pair<int,int> # define ll long long # define fi first # define se second # define bg begin cs int RLEN = 1 << 20 | 1 ; inline char gc ( ) { static char ibuf [ RLEN ] , * ib , * ob ; ( ib == ob ) && ( ob = ( ib = ibuf ) + fread ( ibuf , 1 , RLEN , stdin ) ) ; return ( ib == ob ) ? EOF : * ib ++ ; } inline int read ( ) {

[原]《Web前端开发修炼之道》-读书笔记CSS部分

拥有回忆 提交于 2020-03-10 05:31:46
如何组织CSS-分层 应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式;另一部分是css框架,重点是如何对 css 进行组织。如何组织 css 可以有多种角度,例如按功能划分,或者按区块划分。这里讲一下 base.css + common.css + page.css 的组织方法。将网站内的所有样式,按照职能分成三大类:base、common、page,这三者是层叠结构。 1、base 层-精简通用 位于三者的最底层,提供 css reset 功能和粒度最小的通用类——原子类。这一层会被所有页面引用,是页面样式所需依赖的最底层,不同风格的网站可以使用同一个 base 层,所以,应具有高度可移植性,力求精简和通用。该层相对稳定,基本不需要维护,可以简单地放在一个文件里,如 base.css。 css reset 即一开始就将浏览器的默认样式全部去掉,就是通过重新定义标签的样式,“覆盖”掉浏览器提供的默认样式。可以将常用的标签显式地罗列出来,避免使用“*”,如来自于 YUI 的部分 css reset 的代码: /*CSS reset*/ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin

内联函数规则

不打扰是莪最后的温柔 提交于 2020-03-09 12:21:47
1、内联函数的声明必须在调用之前。 #include<iostream> inline bool ischar(char); //内联声明 int main(){ char c; if(ischar(c)){....} } bool ischar(char ch){....} 如果是下面这种情况,那么在程序编译的过程中,并不认为那是内联函数,会将他当做普通函数对待。 #include<iostream> bool ischar(char); //此处无inline int main(){ char c; if(ischar(c)){....} } inline bool ischar(char ch){....} //此处为inline 所以在编译时,在调用之前看到内联声明就十分必要了。 2、内联函数应该尽可能的小,并且要结构简单,这样嵌入代码时才不会影响调用函数的主体结构。因此,内联函数不能出现switch、while等语句,如果出现这些语句,那么编译时将会无视这个内联函数,将它作为普通函数对待。 3、递归函数也不能作为内联函数 来源: https://www.cnblogs.com/peixu/p/12447358.html

模板 岛娘的无敌头文件

人盡茶涼 提交于 2020-03-08 10:12:40
岛娘的无敌头文件 #pragma comment(linker, "/STACK:36777216") //#pragma GCC optimize ("O2") #define LOCAL //#include "testlib.h" #include <functional> #include <algorithm> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <numeric> #include <cstring> #include <climits> #include <cassert> #include <complex> #include <cstdio> #include <string> #include <vector> #include <bitset> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <list> #include <set> #include <map> //#include <tr1/unordered_set> //#include <tr1/unordered_map> //#include <array>

【C++】卡常技巧

亡梦爱人 提交于 2020-03-07 10:34:38
1.若乘上一个2的倍数的数值,可改用左移运算符 例1: x = x * 2 或 x * = 2 改成: x = x << 1 或 x <<= 1 (log 2 2=1) 例2: x = x * 32 或 x * = 32 改成: x = x << 5 或 x <<= 5 (log 2 32=5) 2.若除以一个2的倍数的数值,可改用右移运算符 例1: x = x / 2 或 x / = 2 改成: x = x >> 1 或 x >>= 1 (log 2 2=1) 例2: x = x / 32 或 x / = 32 改成: x = x >> 5 或 x >>= 5 (log 2 32=5) 3.交换两个数值,使用异或(xor)运算符 例: inline void swap ( int & a , int & b ) { int t = a ; a = b ; b = t ; } 改成: inline void swap ( int & a , int & b ) { a = a ^ b ; b = a ^ b ; a = a ^ b ; } 4.for循环卡常 例: for ( int i = 1 ; i <= n ; i ++ ) { } 改成: for ( register int i ( 1 ) ; i <= n ; ++ i ) { } 5.变量类型前加register 例:

Linux设备驱动程序学习——USB 驱动程序(三)

走远了吗. 提交于 2020-03-07 04:43:01
(本部分的一些示例源码来自 drivers/usb/usb-skeleton.c ,它是Linux内核为我们提供的最基础的USB驱动程序,USB骨架程序) 驱动程序把驱动对象注册到 USB 子系统中,之后使用供应商(idVendor)和设备(idProduct)标识来判断对应的硬件是否已经安装. 驱动的设备支持列表 struct usb_device_id 结构提供了这个驱动支持的不同类型 USB 设备的列表. USB 核心通过此列表用来决定设备对应的驱动,热插拔脚本也通过此列表来决定当特定设备被插入系统时,应该自动加载的驱动. struct usb_device_id { /* 确定设备信息去和结构体中哪几个字段匹配来判断驱动的适用性 */ __u16 match_flags ; /* Used for product specific matches; range is inclusive */ __u16 idVendor ; //USB设备的制造商ID,须向 www.usb.org 申请 __u16 idProduct ; //USB设备的产品ID,有制造商自定 __u16 bcdDevice_lo ; /* USB设备的产品版本号最低值*/ __u16 bcdDevice_hi ; /* 和最高值,以BCD码来表示。*/ /* 分别定义设备的类,子类和协议,他们由 USB