C/C++零散知识点总结(四)


  • 1. 快排的原理以及快排为什么快

    • 快排利用了分治法的思想,将原问题划分为类似的多个结构相似的子问题,递归解决得到最终结果

    • 相比堆排序,快排只需要递归解决每个子问题的排序即可,而堆排序要经过建堆、交换、堆调整几个步骤,其中堆调整是耗时最长的步骤,导致在数据规模增大时,快排优势越来越明显

  • 2. C++面向对象设计的七个原则

    • [1] 单一职责原则:一个类最好只做一件事。各司其职

    • [2] 开闭原则:软件实体应该是可扩展的,对扩展开放,对修改封闭

    • [3] 里氏替换原则:子类必须能够替换基类。即子类只能扩展基类,不能隐藏或覆盖基类。因此,违反里氏替换原则必然违反开闭原则

    • [4] 依赖倒置原则:依赖于抽象。即高层不依赖于底层模块,同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。依赖于抽象就是对接口编程,不是对实现编程。

    • [5] 接口隔离原则:使用多个小的专门的接口,不要使用一个大的总的接口。

    • [6] 迪米特法则:(最少知道原则),松耦合,一个对象应该尽可能少的去了解其他对象,尽量相互独立

    • [7] 合成复用原则:尽量使用组合/聚合,少用继承。在一个新对象里,通过关联关系来使用一些已有的对象,使之成为新对象的一部分。

  • 3. 指针和指针数组

    • int *p[2]:指针数组。是一个数组,元素是指针。int *类型的数组,每个元素都是int *类型,存储地址
    • int (* p)[2]:数组指针。是一个指针,指向数组。n行2列的二维数组,列数确定,行数不确定
    • int **p:指针的指针,二级指针。p指向的内存中存放的是一个int *类型的指针变量

    • int (* p)[3]用法举例:

int a[][3] = {1,2,3,4,5,6,7,8,9};

int (* p)[3] = a;

*(p + 2) = &a[2];               //第3行
*(p + 2) + 1 = &a[2][1];        //第3行第2列元素地址(数组地址连续)
*(*(p + 2) + 1) = a[2][1] = 8;
  • 4. 各层协议设备工作过程

    • MAC:物理设备
    • ARP/RARP:网络层协议,工作在数据链路层。路由器
    • IP:路由器;ICMP:网络层协议,工作在运输层
    • TCP/UDP:网关
  • 5. 进程间通信方式

    • [1] 管道:半双工通信方式,管道只能在具有亲缘性的进程间使用,有名管道允许无亲缘性进程间通信
    • [2] 信号量:进程线程都有信号量通信方式
    • [3] 信号:中断方式的一种模拟,比较复杂的通信方式,用于通知进程某个事件已经发生
    • [4] 消息队列:消息的链表,克服了信号传递信息少的缺点。有写/读权限的进程可以往消息队列中添加信息/读取信息
    • [5] 共享内存:多个进程访问同一块内存,是最快的IPC形式。往往与信号量等结合使用达到进程同步和互斥
    • [6] 套接字:进程间通信机制,可用于不同机器之间的进程通信
  • 6. git和svn维护工具的区别,git相对svn的优势

    • [1] 使用Git,团队规模不受版本库工具自身的限制:svn提交无冲突合并再提交存在次数限制
    • [2] Git分支管理功能强大
    • [3] Git可设置不同权限,实现更好的发布控制
    • [4] 隔离开发,提交审核
    • [5] 已修复bug不再重现
    • [6] 版本库的安全性
    • svn具有悲观锁的功能,一个用户编辑时可对文件进行锁定,防止多人同时编辑同一文件
  • 7. 判断链表是否有环代码

struct node
{
    int data;
    struct node *next;
}Node,*NodeList;

bool IsLoop(Node *L)
{
    Node *pSlow = L;
    Node *pFast = L;
    while (pSlow != NULL && pFast != NULL)
    {
        pSlow = pSlow -> next;
        pFast = pFast -> next -> next;
        if (pSlow == pFast)
            return true;
    }
    return false;
}
  • 8. 链表和数组的区别

    • 数组必须事先指定元素个数,链表可以动态增减元素
    • 数组寻址更快,数据查找更方便,链表操作灵活,元素增减更高效
    • 静态数组从栈中分配,操作更迅速但自由度小;链表从堆中分配,自由度大但管理麻烦
  • 9. 进程和线程的区别

    • [1] 地址空间:进程有自己独立的地址空间,线程共享进程的地址空间
    • [2] 资源占有:进程是资源分配和拥有的单位,线程共享进程的资源
    • [3] 并发性:均可并发执行。但线程划分尺度小于进程,多线程程序并发度更高
    • [4] 独立性:进程之间相互独立,因此进程之间同步简单但数据共享复杂;线程不能独立执行,线程之间数据共享简单但同步复杂
    • [5] 调度和切换:线程是程序执行的最小单位,进程是操作系统分配资源的最小单位。线程上下文切换比进程切换快
    • [6] 创建/销毁/切换:进程创建/销毁/切换复杂,速度慢;线程创建/销毁/切换简单,速度快
    • [7] CPU和内存占用:进程内存占用大,CPU利用率偏低;线程内存占用少,CPU利用率高
    • [8] 编程/调试:进程编程调试简单,线程编程调试复杂
    • [9] 可靠性:进程间不会相互影响,一个线程挂掉可能导致整个进程挂掉
    • [10] 分布式:进程适用于多核多机分布式,线程适用于多核分布式



参考资料
http://blog.csdn.net/u010355144/article/details/44940171
http://blog.csdn.net/baidu_35692628/article/details/69218808

2017.10.15

你可能感兴趣的:(C/C++)