要点
- nginx 的进程由用户设置,单个worker进程就可以处理用户所有的事件,epoll_wait 返回大量事件(A,B,C,D,E)时,服务器会顺序执行的所有的事件,事件A没有处理完,E是不能执行的,也不用同时分配内存,这样就避免内存井喷的现象,当事件处理粒度大的时候,性能就出现瓶颈了
表达式合法性和语义由操作数类型决定
如果两个类型之间可以转换,则称这两类型相关
C++类型转换目标是尽可能防止精度丢失
方便开发人员的使用,避免各种显式地转换
提供自然的语义,像内置类型一样,int(1) + double(1.1)
无需额外重载,来支持多种操作符运算,重载数量与运算符线性相关!
当某个变量需要T2类型值,而该表达式值为T1类型,此时编译器会执行隐式类型转换。
具体场景:
当该表达式作为某个操作符(=
, +
…)的操作数,与期望类型T2不符
当该表达式作为函数调用实参,与形参类型T2不符
当作为函数返回语句时,与返回类型T2不符
当该表达式作为switch语句(T2为intergal)
当该表达式作为条件表达式(if, while, for, !, &&, ||)(T2为bool)
单参数构造函数(converting constructor)
1 | T1(T2 t2); |
类型转换操作符函数(Conversion Operator)
1 | operator T2&(); |
# 禁止隐式类型转换
通过explicit
关键字修饰函数,说明该函数不能被用来隐式转换,只能进行显式转换!
singed
和’unsigned’时,singed
会转化为unsinged
(对应类型的模运算值,如1B的-1转换为255)优点:
意图更加明确,编译器可以提供更准确地检查,尽可能早地发现错误
利于代码阅读和工具检索
static_cast
编译期内
使用隐式类型转换或用户自定义转换
安全性较高,编译器进行类型检查
用途:
相关类型的转换,如整型到枚举,浮点到整型
显式转换,即使造成精度丢失,编译器也不会警告
与void*
的双向转换
reinterpret_cast
编译期内
不做任何检查的转换,保证再次转换回来时,值不变(前提是转换的类型有足够的空间存储原有值)
危险性最高,完全靠程序员掌握
不生成任何CPU指令,对编译器而言,直接把该值作为指定类型(变量的属性)操作
用途:
1 | int i = 1; |
const_cast
添加或移除const
,volatile
修饰
dynamic_cast
运行期内转换
提供类型安全检查,可以知道转换是否成功
最耗时
用途:
在同一个继承体系(带有虚函数表的)中进行类型转换
子类向基类的向上转型(Up Cast)
基类向子类的向下转型(Down Cast)
横向转型(Cross Cast)
_1,_2...
代表的是原函数的第n个参数1 | void f(int i, int j, int k) |
| 类型 | 32位 | 64位 |
|———+——-+——-|
| char | 1 | 1 |
| short | 2 | 2 |
| int | 4 | 4 |
| long | 4 | 8 |
| float | 4 | 8 |
| double | 8 | 8 |
| pointer | 4 | 8 |
cat /sys/class/net/enp0s3/mtu
netstat -i
ip address show