内联函数,宏定义,内存对齐,类型转换
Posted sofard
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内联函数,宏定义,内存对齐,类型转换相关的知识,希望对你有一定的参考价值。
宏 与 inline的区别
存在的价值,两者都是文本替换,降低程序跳转次数,提高效率
1. define 是预处理命令,无法调试 ,最简单文本替换,
inline 是编译期替换,可以调试, 存在参数类型检查
2. 使用inline的时候,函数必须定义
直接定义的函数,自动转化为inline
define 怎么访问类的变量..,
////////////////////////////////////////////////////////////////////////////////////////////////////
内存对齐
原因:机器字长,寻址速度,运算速度,平台移植原因
原则:每个元素的起始地址都是 sizeof(自己) 的一定倍数
struct 中 套 struct ,按照原则,先对齐内层 struct,再对齐外部struct
union取最大
大端小段问题,分布式系统数据tcp数据包转换问题
////////////////////////////////////////////////////////////////////////////////////////////////
static_cast, dynamic_cast, const_cast, reinterpret_cast
任何问题在编译器能解决,尽量不要拖到运行期
升级1
char c= 123; int * p =(int *)&c; //不安全代码,C编译器不做判断,能运行,但是有时候会出错
C中强转,在C++中被 static_cast<T>取代,编译期间做安全检查,C:B,A; C转为A,或者B ,会自动计算地址
升级2
子类父类 指针转换,static_cast<T>可以做到,但是带来了问题
子类转为父类(大的转为小的),访问的时候可能越界,报错,这个是运行时错误,static_cast<T>无法处理
于是出现了dynamic_cast<T>,主要用于向下转换
dynamic_cast<source>(expression),源和目标必须存在继承关系,必须存在虚函数,必须是指针与引用
如果能转换,就转换,如果不能转换就返回NULL(RTTI,运行时类型检查)
升级3
const_cast
有些地方我们没法使用const变量,这个时候可以const_cast 去除(仅本次)const属性
升级4
reinterpret_cast
极其危险,不知道存在的价值
以上是关于内联函数,宏定义,内存对齐,类型转换的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )