宏定义可以提高效率,但是宏不是函数。 预编译通过代码复制的方式代替函数调用,省去了诸如函数压栈等系统过程,从而提高了效率。但是由于宏定义仅仅是代码替换,所以引起很多问题。
#define  MAX(a,b)  (a) > (b) ? ( a) : (b)
result=MAX(A,B) +2  编译器对其解释为 (a) > (b) ? (a) : (b)+2 .导致该语句执行与预期不符。
宏定义的另一个缺点就是无法访问类的私有成员。

而内联函数通过把代码直接复制进调用函数体内,避免产生某些系统过程,同样提高了效率,但是 内联函数可以进行类型检查,this指针同样能应用,这是宏定义无法比拟的。

内联函数必须是函数的声明和定义一体,且在函数前面加inline。

内存的三种分配方式:静态存储区分配,栈上分配,堆上分配。

内存使用常见错误

(1)内存分配不成功,却使用它。对策:使用前检查内存是否为NULL。

(2)内存分配成功,但没有初始化就使用它。对策:内存分配后初始化。

(3)内存分配成功且已经初始化,但是越界。对策:做越界检查。

(4)忘记释放内存,造成内存泄漏。对策:内存动态分配和释放必须成双配对。

(5)释放了内存却继续使用它。

(a)对象关系过于复杂,理不清楚究竟释放了没有。

(b)return指向栈内存的指针或引用。

(c)free或delete内存后,没有把指针置为NULL。导致野指针。

指针与数组。数组名对应着(而不是指向)一块内存,在生存期内,其地址不可改变,只能是数组内容改变。

sizeof():

sizeof(数组)= 数组元素个数*sizeof(数组的元素数据类型)。

sizeof(指针)= 4;

数组作为参数传递时,数组名自动退化为指针类型,即sizeof(数组)=4;

sizeof(结构体或者类):这个有点麻烦,和编译器的设置有关系,pragma pack(n)是编译器指定的内存字节对齐方式,sizeof(结构或者类)和pragma pack(n)关系密切,默认的n=8,结构中的成员占用的内存起始地址为成员的数据类型的大小和n相比较的较小值。

指针参数

不要让指针参数在函数体内部申请内存,如果非要指针在函数体内部申请内存,就要用指针的指针。函数的返回值不能使用栈内分配的变量地址。

野指针:用malloc和new 分配了内存,就得用free和delete 释放,否则造成内存泄漏,但是只释放内存还是不够安全的,必须在释放内存后,让指针指向NULL,才不至于造成野指针。我理解的野指针就是没有正确指向的指针。

宏定义和内联函数的学习相关推荐

  1. 宏定义和内联函数的区别

    宏定义和内联函数都是为了使得程序减少函数的调用而花费的开销,提高了执行效率 宏定义只是作简单的文本替换,而内联函数则是在调用出展开 宏定义在预处理时作替换,而内联函数在编译时展开 内联函数会做类型.语 ...

  2. C++内联函数的学习

    内联成员函数两种方式 实现的时候加inline    直接在类中给出实现方式 内联函数,题号效率,在编译的时候,将代码直接嵌入到调用的地方, 从而减少了函数调用的开销. 每调用一次,程序体积就会变大, ...

  3. 复习笔记(四)——C++内联函数

    什么是内联函数 内联函数是指通过 inline 关键字定义的函数,包括全局函数和类的成员函数. 内联函数在编译阶段展开,编译器将整个函数体代码嵌入到调用处,不产生函数跳转. 内联函数的定义 inlin ...

  4. 内联函数和宏定义的区别

    用内联取代宏: 1.内联函数在运行时可调试,而宏定义不可以; 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会:  3.内联函数可以访问类的成员变量,宏定义则不能 ...

  5. c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨

    C语言里面的内联函数(inline)与宏定义(#define)探讨 先简明扼要,说下关键: 1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样 ...

  6. c++学习笔记内联函数,函数重载,默认参数

    c++学习笔记内联函数,函数重载,默认参数 1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3;  #define A 3 C++中是否有解决 ...

  7. C++内联函数学习总结

    C++中的内联函数inline总结 http://blog.csdn.net/coder_xia/article/details/6723387 突然看到C++Primer中讲到,对于vector的一 ...

  8. C++中宏与内联函数

    1宏定义 C++是C的超集,C++继承了C的一个重要特性就是效率,在C中提高程序运行效率的重要手段就是宏,宏可以不用普通函数的调用但使用起来就像普通函数调用一样,宏的实现采用的是预处理器而不是编译器, ...

  9. 内联函数的声明和定义

    一.什么叫inline函数? inline(小心,不是online),翻译成"内联"或"内嵌".意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函 ...

最新文章

  1. 某程序员求助:求职大厂时合并简历,如今面试已过,还能坦白吗?
  2. C/C++语言中计算int,float,double,char四种数据类型所能表示的数据范围
  3. java zipinputstream_Java之解压流(ZipInputStream)
  4. 【并行计算-CUDA开发】显卡两大生产商
  5. boost::intrusive::set用法的测试程序
  6. ABAP 740里的新语法 - LET表达式
  7. python爬虫反爬对抗_python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站...
  8. Centos 下PHP编译安装fileinfo扩展
  9. 【什么是数据隐私?安全与隐私的区别?】差分隐私代码实现系列(一)
  10. strstr 可以用来查找子字符串的位置
  11. 阿里云张献涛:如何修炼云计算的弹指神通
  12. 文件(夹)操作SHFileOperation (删除 复制 移动) 报错 无法读取源文件或磁盘
  13. 时间戳 太平洋夏令时间和本地时间相互转换及自定义夏令时
  14. 《网络是这样连接的》读书笔记2
  15. win32 opengl画线
  16. 华图教育_南京_前端实习面试
  17. SQL基础-更新删除视图
  18. P1535 游荡的奶牛
  19. DF-700滤桶 四个角扣具漏水问题
  20. ABP入门教程(四)初探领域驱动设计

热门文章

  1. Python中抓网页的小陷阱
  2. Vue — 第三天(计算属性和json-server)
  3. 面试官: 用css实现android系统的loading动画
  4. Codeforces 722C. Destroying Array
  5. ffmpeg文档08-表达式计算/求值
  6. redis 笔记06 发布与订阅、事务、慢查询日志、监视器
  7. Foundation框架
  8. Google Mesa概览
  9. 原来fb可以在一个工程里面输出多个swf模块
  10. 现货黄金入门知识普及一:图形分析之K线理论