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

宏 与 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

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

原文地址:https://www.cnblogs.com/sofard/p/9821756.html

时间: 2024-08-11 09:53:40

内联函数,宏定义,内存对齐,类型转换的相关文章

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

内联函数的定义及说明

一.什么叫inline函数? inline(小心,不是online),翻译成"内联"或"内嵌".意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度.(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间).这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大.拿生活现象比喻,就像电视坏了,通过

内联函数替代有参宏

最近接到了一个老板的需求,要把我们的程序进行国际化,就是新增一个英语的支持.大致的需求是这个样子的:程序内添加语言切换选项,并在第一次安装的时候自动选择合适的语言(中文系统的手机(无论简体中文繁体中文)一律使用简体中文,其它语言的(无论英语还是法语德语)都默认使用英文).其实如果只是添加多语言支持,不再应用内切换语言,苹果的开发就能很好的支持了.就是多了这个应用内切换语言(像微信那样),逻辑就复杂了很多.因为之前的时候字符串都是写死在程序中的,所以不可能大范围的更改.又要涉及到语言的切换,所以,

C++ 内联函数

1.定义: 被调用函数的函数体代码直接插入到该函数被调用处, 而不是通过call语句进行. 2.方式: (1).类的定义体外: 当在类的定义体外时,需要在该成员函数的定义前面加“inline”关键字,显式地告诉编译器该函数在调用时需要“内联”处理,如: class Person { public: string GetName(); private:   string  name; }; inline string GetName() {         return name; } (2).类

内联函数详解

什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数.内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内.而说明在类体内,定义在类体外的成员函数叫外联函数.外联函数的函数体在类的实现部分. 内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度. 内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义

内联函数 inline 漫谈

内联函数存在的结论是: 引入内联函数是为了解决函数调用效率的问题 由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址.函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题. 不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要: (1)将下一条指令的所在地址入栈 (2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序). 原因 因为调用函数实际上将程序执行顺序转移到函数所存放在内存

iOS OC内联函数 inline的详解

inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A.不会导致重名的错误. inline.内联函数. 作用:替代宏. (如果你在看框架时,看到inline不解,搜索到这篇文章,看到这里可以不用看下面的详述了) 在框架中出现inline时,如YYKit框架.我们稍加观察就会发现它出现在.h文件中. such as: static inline CGFlo

C++内联函数的使用

1.为什么要用内联函数? 在C++中我们通常定义以下函数来求两个整数的最大值: int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个函数的好处有: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多 ③ 使用函数可以确保统一的行为,每个测试都保证以相同的方式实现 ④ 函数可以重用,不必为其他应用程序重写代码 虽然有这么多

虚函数可以是内联函数吗?

虚函数是通过指针或引用调用函数时,通过虚函数表来确定调用的函数,在运行时确定. 内联函数是在编译时,将调用函数处插入内联函数的代码,省去了函数调用时的开销. 表面上看,虚函数不能为内联函数.我们在类中定义的函数都是内联函数,析构函数经常在类中定义,而析构函数又经常声明为虚函数,以前没有发现什么问题. 其实虚函数可以为内联函数,这与内联函数的定义没什么冲突. 内联函数到底要不要在调用处展开取决于怎么调用内联函数. class A { A(){} ~A(){} virtual void foo()

(inline)内联函数在IOS开发中的使用

今天在阅读YYKit源码(https://github.com/ibireme/YYKit.git)时发现在YYKitMacro.h组件中大量使用的内联函数,例如此文件中的一个函数 static inline void dispatch_async_on_main_queue(void (^block)()) { if (pthread_main_np()) { block(); } else { dispatch_async(dispatch_get_main_queue(), block);