一、 大小端概念
Big-Endian和Little-Endian的定义如下:
Little-Endian 数据的低位字节位存放在内存的低地址端,高位字节存放在内存的高地址端。
Big-Endian 数据的高位字节位存放在内存的低地址端,低位字节存放在内存的高地址端
大端模式
低地址 -----------------> 高地址0x12 | 0x34 | 0x56 | 0x78小端模式
低地址 ------------------> 高地址0x78 | 0x56 | 0x34 | 0x12bool 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:通过红黑树来实现。查找非常快,查找算法复杂度为log2nlog2nlist:通过链表来实现。六、 const用法
归纳为一句话就是:const永远是修饰它前面的内容。但有个例外就是const在最前面时,如const int *p;,等同于int const *p;。
七、static的作用
在函数体内,static变量只在第一次进入函数体内时被初始化。该变量存储在静态存储区。在模块(源文件)内,被声明为static的函数只在该模块(源文件)内可见。在模块(源文件)内,被声明为static的全局变量只在该模块(源文件)内可见。在类内,被声明为static的成员变量必须在类的外部初始化,不属于类的任何对象,被整个类所拥有。在类内,被声明为static的成员函数,不属于类的任何对象,被整个类所拥有,可以访问类的static成员变量。