一些面试知识点

来源:互联网 发布:数控磨床外圆量仪编程 编辑:程序博客网 时间:2024/05/22 08:03
C++回顾
1. _beginthread和CreateThread区别
    CreateThread是Windows系统函数,_beginthread是CRT函数
    _beginthread实际内部还是调用的CreateThread函数实现
    CRT函数当中需要存储一些变量 类似getlasterror的错误信息,但是假如使用全局变量,在多线程下会出现错误,所以需要为每一个线程单独分配这些数据
    CRT定义了tiddata数据结构存储这些数据,_beginthread和_endthread中提供了规范的构造 销毁这个数据结构的方式
    假如_beginthread/_endthread和CreateThread/ExitThread混用可能造成内存泄露
    当没有使用_beginthread创建线程时,假如使用到CRT函数,它会自动的检查并创建tiddata结构
    当md mdd既动态链接加载CRT库时 dllmain作为dll的入口函数 在dll detachthread时,会做一步free tiddata检查,释放指针
    综合来看,使用_beginthread/_endthread是一种比较稳妥的选择

2. const成员函数中修改成员变量的值
    mutable修饰符
    指针

3. postmessage和sendmessage区别,以及怎么实现
    postmessage是一个非阻塞函数,它只把消息扔到窗口线程的消息队列当中,直接返回本函数的成功与否

    sendmessage是一个阻塞函数,它把消息扔到窗口并且等到消息运行结束,返回消息运行结果
    具体来说
    在发送线程和窗口线程为同一线程时,直接获取窗口的窗口函数并运行获取结果
    在发送线程和窗口线程为不同线程时
        1 发送线程将消息发送到窗口线程的发送消息队列,并设置QS_SENDMESSAGE标志,发送线程挂起,窗口线程激活
        2 窗口线程假如在执行其他程序,继续执行,直到继续下一次消息循环查询(GetMessage)
        3 这里会优先的查询QS_SENDMESSAGE标志,假如激活,从发送消息队列取出消息,如果没有消息QS_SENDMESSAGE关闭
        4 窗口线程处理该消息,并将结果发送到发送线程的应答消息队列
        5 发送线程激活,取出处理结果

4. 消息队列/消息循环属于进程? 线程? 窗口?
    消息队列分为系统消息队列和线程消息队列
    1个线程可以创建多个窗口,并且创建的窗口共享同一个线程消息队列和消息循环
    此外,除了普通的消息队列 还存在和SendMessage相关的发送/应答消息队列

5. 析构函数/拷贝构造函数/赋值运算符重载的原理和原因
    有堆内存,需要发生深拷贝时需要定义这三个函数

6. c++11的新特性
    auto 自动类型推导
        auto i = 0;
    nullptr 空指针 解决原先NULL的二义性
        int a = nullptr; // error
        int n = NULL;  // right
    for_range遍历,可用于遍历字符串/数组/stl容器
        std::vector<int> vecVal = {1,2,3,4,5,6};
        for (auto val : vecVal) {
            printf(val);
        }
    Override修饰这是一个重写虚函数,用于防止错误
    final修饰这个虚函数不能被重写

7. 几种智能指针
8. 线程通信同步/互斥
9. 进程通信同步/互斥 通信
10. boost库
11. 空间复杂度/时间复杂度计算
12. 各种排序算法
13. stl各种数据结构
原创粉丝点击