内联函数,宏定义,内存对齐,类型转换

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

极其危险,不知道存在的价值

以上是关于内联函数,宏定义,内存对齐,类型转换的主要内容,如果未能解决你的问题,请参考以下文章

深入探讨 内联函数和宏定义的区别

C++中宏替换与内联函数的区别

Kotlin函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )

编织内联类型转换(python)

宏定义方式 进行枚举类型和枚举类型的相互转换

go语言基础函数,数组,指针,结构体