C++学习之基本概念

一、 大小端概念

Big-Endian和Little-Endian的定义如下:

Little-Endian 数据的低位字节位存放在内存的低地址端,高位字节存放在内存的高地址端。

Big-Endian 数据的高位字节位存放在内存的低地址端,低位字节存放在内存的高地址端

大端模式
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78

小端模式
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12

bool IsLittleEndian() {
int a = 0x1234;
char c = *(char *)&a;
if (c == 0x34) {
return true;
}
return false;
}

常用系统的大小端
目前Intel的80x86系列芯片是唯一还在坚持使用小端的芯片(windows系统就是基于该架构),ARM芯片默认采用小端,但可以切换为大端。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端模式。

二、 指针与引用的区别

引用必须在定义的时候进行初始化。如果是成员变量的引用类型,则必须通过构造函数初始化列表来初始化。
引用一经初始化之后,不能修改;而指针可以修改,重新指向其他变量。
因为引用不可变,所以没有必要用const修饰(视编译器不同,有的会产生警告,有的会产生编译错误);而指针有const,const的指针不可变
指针可以为NULL,而引用不能。
指针归根到底是一个变量,存储的是变量地址;而引用则是变量的一个别名,是指针的弱化版本。
sizeof(指针)得到的是指针的大小,而sizeof(引用)得到的是引用的变量的大小

三、free

free函数会对参数是否为NULL进行校验,所以free(NULL);不会引发程序崩溃。

 

四、 C++内存分配方式

C++的内存分配分为:堆、栈、全局/静态存储区、常量存储区。
堆:由程序员分配和释放,若程序员未释放,则在程序结束时由操作系统释放。堆是向着内存地址增加的方向生长。
栈:由编译器自动分配和释放,主要存储函数参数,局部变量等。栈是向着内存地址减少的方向生长。
全局/静态存储区:存储全局变量和静态变量。初始化的和未初始化的全局/静态变量分开存储。
常量存储区:存储程序中的常量。

五、 STL容器的实现方式

vector:通过数组来实现。vector每次扩容时,会扩大为当前需要容量的2倍。
map:通过红黑树来实现。查找非常快,查找算法复杂度为log2nlog2n
list:通过链表来实现。

六、 const用法

归纳为一句话就是:const永远是修饰它前面的内容。但有个例外就是const在最前面时,如const int *p;,等同于int const *p;。

七、static的作用

在函数体内,static变量只在第一次进入函数体内时被初始化。该变量存储在静态存储区。
在模块(源文件)内,被声明为static的函数只在该模块(源文件)内可见。
在模块(源文件)内,被声明为static的全局变量只在该模块(源文件)内可见。
在类内,被声明为static的成员变量必须在类的外部初始化,不属于类的任何对象,被整个类所拥有。
在类内,被声明为static的成员函数,不属于类的任何对象,被整个类所拥有,可以访问类的static成员变量。

 

posted @ 2019-02-13 15:50  xlsss  阅读(124)  评论(0编辑  收藏  举报