1.C++
空类型的实例中不包含任何信息,但是sizeof的值为1,因为声明该类型的实例时,必须在内存中占有一定的空间,否则无法使用这些实例
在类型中添加一个构造函数和析构函数,sizeof类型还是为1
因为调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与类型的实例无关,编译器也不会因为这两个函数而在实例中添加任何额外的信息如果把析构函数标记为虚函数,则会在实例中多存放一个指向虚函数表的指针,在32位机器上,一个指针占4个字节,在64位机器上,一个指针占8个字节
C++标准不允许拷贝构造函数传递值类型,因为传递值类型,就需要将传入参数拷贝一份,就会无线循环调用拷贝构造函数
2.数组
数组是顺序存储结构,占据一块连续的内存并按顺序存储数据。
- 数组中的内存是连续的,可以根据下标在O(1)时间读写任何元素,时间效率很高
- 为了避免数组空间效率不高,先为数组开辟较小的空间,然后往数组添加数据,当数据的数目超过数组的容量时,在重新分配一块更大的空间,把之前的数据复制到新的数组中,再把之前的内存释放
- 使用动态数组时,要尽量减少改变数组容量大小的次数
- 数组的名字也是一个指向数组第一个元素的指针,访问数组元素时,要防止越界
- 数组作为函数的参数传递时,数组就会自动退化为同类型的指针
3.字符串
char str1[]="hello world";
char str2[]="hello world";
char *str3="hello world";
char *str4="hello world";
str1和str2是两个字符串数组,会为其分配12个字节的空间,并将hello world的内容复制到数组中去,这是两个初始地址不同的数组
而str3和str4是两个指针,不会为它们分配内存以存储字符串的内容,只要将它们都指向"hello world"在内存中的地址就可以了,常量字符串再内存中只有一个拷贝,所有它们指向同一个地址
- C++中的string是通过短字符串优化来实现的
- C#中的string是通过写时复制实现的
4.用两个栈实现队列
当stack2中不为空时,在stack2栈顶的元素是最先进入队列的元素,可以弹出。当stack2为空时,可以把stack1中的元素逐个弹出并压入stack2,可以直接弹出,每次插入新的数据还是压入stack1
5.排序算法
- 快速排序在数组本身已经排好序,每次都是以最后一个数组作为比较标准,这时快速排序的效率只有O(n2)