前言
这两天都没总结八股文,正好今天休息一天把前两天欠的东西补上
C++ vector
1.vector是一个动态数组,用一片连续的内存空间存放数据,底层实现是三个指针,一个指向头,一个指向当前存放元素的位置,一个指向尾也就是本身的大小。
2.vector的特点是如果当前存放元素的数量等于空间大小,vector会自动进行扩容。扩容的过程是先拷贝元素,释放旧空间,申请新空间,一般扩容采用倍数扩容O(1)如1.5倍(VS),2倍(Linux)而不采用等长扩容O(n)。2倍扩容后的新空间必定大于前面的总和,导致前面的空间无法使用;而1.5倍在几次扩容后可以使用之前的空间。而这个倍数的原理其实需要满足的公式是An-2+An-1>An,是斐波那契数列,而斐波那契数列有一个最佳扩容因子为1.618倍。
3.因为每次扩容都要拷贝元素开销很大,所以为了避免过大开销最好的方式是预估vector的空间并开好,避免扩容发生。
4.vector对于随机访问的性能很好,但插入删除因为涉及到移动元素和扩容,性能很低。而且插入删除操作因为改变内存空间地址,所以会导致迭代器失效。
C++ 单例设计模式
1.单例设计模式保证类的实例化对象只有一个,一般用于程序中某个类只需要一个对象,如任务管理器只能打开一个,操作系统中文件管理系统只能有一个等。
2.单例设计模式通过将构造函数,拷贝构造函数,赋值构造函数设置为私有,防止在外部调用创建对象。
3.单例设计模式分为懒汉式和饿汉式
饿汉式:在类定义的时候就实例化,是线程安全的
class Singleton{
private:
static Singleton* instence;
Singleton(const Singleton& temp){}
Singleton& operator=(const Singleton& temp){}
protected:
Singleton(){}
public:
static Singleton* getInstence(){
return instence;
}
};
Singleton* Singleton::instence = new Singleton();
懒汉式:第一次用到才失效,非线程安全,一般通过加锁或者使用内部静态变量保证线程安全
class Singleton
{
public:
static Singleton* GetInstance()
{
static Singleton singleton;/
return &singleton;
}
private:
Singleton();
}
操作系统 进程和线程
1.进程是系统分配资源的单位,线程是CPU调度的单位,一个进程中可以有多个线程,他们共享这个进程的资源。
2.同一个进程中切换线程不会引起进程切换,不同进程中的线程切换会引起进程切换。进程切换的会记录,分配和撤销进程所掌握的内存资源,CPU资源,开销很大。
3.进程间的通信需要某些方式,而线程间通信读取统一进程的资源即可。
总结
把两天欠的八股总结补上了,坚持就是胜利