程序员成长之旅——预处理/const/static/sizeof

程序员成长之旅——预处理/const/static/sizeof

预处理
点击链接
说明const与#define的特点和区别
#define只是用来做文本替换的
也就是说#define只是在预处理的时候进行展开的,它的生命周期止于编译期,它存在于程序的代码段,在实际程序中它只是一个常数、一个命令的参数、并没有实际的存在。
const常量存在于程序的数据段,并在堆栈分配了空间。const常量是一个运行时的概念,它在程序中确确实实存在着并可以调用、传递。
const常量有数据类型,而宏常量没有。
编译器可以对const常量进行类型安全检查。
C++中const有什么作用
(1)const用于定义常量:const定义的常量,编译器可以对其进行数据静态类型安全检查。
(2)const修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型时,应该将值传递改为const&传递,可以提高效率。
(3)const修饰函数的返回值
(4)const修饰类的成员函数
static有什么作用
(1)在函数体,一个被声明为静态的变量在这一函数被调用的过程维持其值不变。
(2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但是不能被模块外的函数访问。它是一个本地的全局变量。
(3)在模块内,一个被声明的静态函数只能被此模块内的其它函数调用,不能被模块外调用,也就是限制了它的作用范围。
static全局变量与普通的全局变量有什么区别
static全局变量和普通全局变量的区别是,static全局变量只初始化一次,防止在其他文件单元中被引用。作用域不同,static全局变量的作用域只在定义的源文件中有效,而非静态全局变量在所有源文件皆有效。
static局部变量和普通局部变量的区别是,static局部变量只被初始化一次,下一次依据上一次结果值。
static函数与普通函数的区别是,static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
sizeof与strlen有哪些区别
(1)sizeof是操作符,strlen是函数
(2)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以‘\0’结尾
(3)数组做sizeof的参数不退化,传递给strlen就退化成指针了
(4)大部分编译程序在编译的时候sizeof就被计算过了,这就是sizeof(x)可以用来定义数组维数的原因。strlen的结果要在运行的时候才能计算出来。它是用来计算字符串的长度的,不是计算类型占内存的大小。
(5)sizeof后如果是类型,必须加括弧;如果是变量名,可以不加括弧。这是因为sizeof是操作符,而不是个函数。
(6)在计算字符串数组的长度上有区别
(7)如果要计算指针所指向的字符串的长度,则一定要使用strlen。
sizeof有哪些用途
(1)可以查看某个类型的对象在内存中所占的单元字节
(2)在动态分配一对象时,可以让系统知道要分配多少内存
(3)由于操作数的字节数在实现的时候可能会出现变化,建议在涉及操作数字节大小时用sizeof来代替常量计算
为什么要引入内联函数
引入内联函数的主要目的是,用它代替C语言中表达式的宏定义来解决程序中函数调用的效率问题。
为什么inline能很好的取代表达式形式的预定义(宏定义)
(1)inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样的展开),没有了调用的开销,效率也很高。
(2)类的内联函数也是一个真正的函数。编译器在调用一个内联函数时,首先会检查它的参数的类型,保证调用正确;然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
(3)inline可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员和私有成员。
说明内联函数使用的场合
首先使用inline函数完全可以取代表达式形式的宏定义。我们定义的类中把读写成员函数定义成内联函数就可以获得更好的效率。
为什么不把所有的函数都定义为内联函数
(1)如果函数体内的代码比较长,使用内联将会导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内的代码时间要比函数调用的开销大。
(3)递归函数也不行
(4)另外,类的构造函数和析构函数很容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如偷偷的执行了基类或成员对象的构造函数和析构函数。
内联函数与宏有什么区别
(1)内联函数在编译的时候展开,而宏在预处理的时候展开
(2)内联函数是一个函数,而宏不是
(3)内联函数它的安全性高于宏,它可以调试
(4)宏在定义的时候一般会用括号括起来参数,防止二义性,而内联函数不需要
(5)在编译的时候,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换
内联函数、静态函数和普通函数的区别
1.内联函数和普通函数最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝; 而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开(很类似宏的使用),如果在 N处调用了此内联函数,则此函数就会有N个代码段的拷贝。
2.static函数和普通函数的最大的区别在于作用域方面,static函数限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。同时static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零出发——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值