存储单位、预处理和宏和const、vector和string、定义和声明

@一些基本的、重要的、容易忽视的概念

##存储单位
关于存储单位,我们需要知道什么是位、字节、字,这样才知道基本数据类型存储空间的意义。
首先位(比特)Bit,代表一个二进制数字,0或者1,计算机存储的就是一大串有特殊意义的0和1,这是最小的存储单位。而字节(byte)的大小是8个位,即1byte=8bit,这是固定不变的,为什么要有这个单位呢,因为各种信息在计算机中存储处理至少需要1个字节,比如我们常见的char最小存储单位是一个字节,short和汉字是两个字节。需要注意的是,我们平常说的数据类型占用的存储空间是最小限制,然而我们不能在看到该数据类型时就确定它占用空间的大小,因为c++没有统一的底层数据格式,编译器可以在C++标准限制的条件下定义不同的数据类型大小。
而字和字节的关系和操作系统有关,例如在64位的系统中,1字=8字节=64bit。代表了计算机一次可以处理的数据长度,一般位数越多,速度越快。在一些小型的嵌入式中,有16位系统的。
我们生活中常见的流量、内存的单位,B代表字节(这也说明了他存在的意义,任何信息都已二进制存储,但是都已字节来表示和处理),KB代表千字节,MB(兆)、G、T,他们之间的倍数是1024,即2的10次方。
简要谈一谈为什么计算机要用二进制,不用我们以为方便的十进制呢。这只是人们的感性认识,可能因为我们有十个手指,从小到大常用的都是十进制,所以觉得十进制方便,熟能生巧,我们甚至背下来九九乘法表和各种计算技巧,但是这只适合人类。对于计算机来说,它最终要用硬件实现,就是逻辑电路,它通常通过电压来表示高低电平,也就代表着1和0,开和关,然后通过一个个门电路的组合完成复杂的任务,如果用十进制,我们怎么设计出可以代表十个数字的电路基本原则呢,现在的量子计算机也是0和1为基本单位,电路的状态和二进制完美契合,这导致了二进制的不可撼动性。第二点,二进制计算规则简单,两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。想想当初学计算机组成原理时画CPU内部ALU等逻辑器件,很复杂吧,要是十进制的话,那得多么复杂啊。第三点,只有两种状态,抗干扰能力强,如果分成十份,那出错的概率将会大大增加。综上,计算机硬件不害怕计算过程的重复冗长,害怕复杂的计算规则。

vector和string
C++stl提供了vector和string两种数据结构,方便程序设计。
vector就是一个容器,可以装下一串数据序列,可以随意增加和删除,相当于动态数组。创建一个vector实例 vector<数据类型> 名字(长度,元素)。还可以通过push_back()和pop_back()增加和删除元素,删除时是从末位,相当于数组的最后一位。当然也可以指定位置增加删除。
string是一种存储字符串序列的数据结构,比字符数组在使用上方便很多,也可以通过string s[i]的方式指定某个字符。具体方法就不详细介绍了。
关于模板类的相关知识以后再补。

定义和声明
变量的定义和声明:定义和声明是分离的,定义必须初始化。变量定义只能有一次,这是显而易见的。而变量声明在不同文件中可以声明两次,在同一文件只能声明一次。假设1文件声明和定义 int num=1,如果你在2文件中要调用1中的num,必须写extern num,如果在2中重新定义int num=1,会出现链接错误。

预处理、宏、const

一个大型的项目往往需要很多文件,大量的变量,如果每一个都重新声明,将会极大降低效率。于是#代表了预处理,把const,声明放在头文件中,只需要#include一下就可以了,在编译时会把#include的内容替换。
#define就代表了宏,可以有常量和函数形式的,内容要注意加括号,因为只是单纯的替换。但是,我们可以尽量用const和inline函数来代替两种形式的宏,例如 #define num 1.1234一方面,宏在预处理盲目将常量替换成1.1234,最后会出现很多份1.1234,占用空间大,而const num=1.1234就不会出现这种情况,另外,因为编译器不知道num的存在,num没有出现在符号表中,调试起来比较困难,你不知道1.1234的来源,如果定义该常量的头文件是别人写的。inline函数同理,他适合用在函数调用开销大,代码少存储空间少的函数中。具体可以参考《effective c++》。

猜你喜欢

转载自blog.csdn.net/weixin_53344209/article/details/113762319
今日推荐