C++中的那些坑

文章目录

  • 前言
  • 笔记:
      • 几个常问题
      • 变量大总结
      • 函数大总结
      • 类的大总结
      • 代码规范大总结
      • 版本控制大总结
      • 汇编和链接大总结
      • SDK和第三方库大总结

前言

学习一下公司大佬的C++课程,内容如题。

笔记:

几个常问题

问题1. 不初始化变量可能引起,在release下出现crash或死锁但是在Debug下正常运行,已经其它不可预测的运行结果,很难跟踪,所有变量最好在声明时就初始化,而且变量最好是需要使用时才声明,不要提前声明。

问题2. 程序只在Release下会崩溃或死锁,除了前面提到的变量为初始化,还有可能是因为:

  • 多线程竞争导致程序未按预期运行,出现资源无法满足(不理解)。
  • 由于性能的提高导致原本使用较少的资源出现了竞争。
  • 优化导致代码顺序改变或代码被意外优化掉了。

问题3. 像除0这样的操作会产生无意义的值NaN,用无意义的值NaN进行运算,会导致无明确定义的结果,在不同平台或编译器结果不一样,常见的运算结果是NaN、0。调试时可以使用std::isnan来进行捕获。

问题4. C++程序在启动过程中会初始化哪些变量

  • 静态初始化,编译时就确定值的全局变量或常量。
  • 动态初始化,函数(包括构造函数)计算获得值的全局变量。
  • 初始顺序是定义的顺序,销毁则是相反的顺序(注册到atexit)。

问题5. 函数内定义的静态变量,是在代码第一次执行时才初始化,并且就构造并初始化一次。虽然说第一次制作时才构造并初始化,该变量的空间占用确是程序执行前就会有了,和全局变量一样,销毁也和全局变量一样。

问题6. 怎么避免复制函数返回的临时变量?

  • 最简单的办法,将这个临时变量赋值给一个新变量,但是性能完全取决于拷贝构造函数,一般都不好。
  • 提供右值引用构造函数(A(A&& other)),或者右值引用复制构造函数(A& operator=(A&& other)),右值运算使用的std::move内部是对地址进行交换,没有复制操作,所以效率极高,右值概念是C++11及以后版本才有的。

问题7. wchar_t(宽字符) 的空间,Windows相关为2字节,Linux/Unix相关的为4字节,如果要考虑跨平台,不要使用wchar_t,可以使用uft8或utf16这种平台无关的编码

问题8. 代码的提交日志我们应该要写明什么内容?

  • 解决了什么问题,或添加了什么功能 what
  • 如果是解决问题,问题的根本原因是什么,为什么你的修改能修改掉这个问题 why
  • 是否还有遗留的问题或者需要注意的事项
  • 如果是新加功能,简单描述功能包含的内容

问题9. 单例模式有哪些写法?他们的问题是什么?

  • 使用全局静态变量、静态成员变量或本地静态变量,线程安全,用与不用都会存在,初始化顺序无法保证,难以控制对象的销毁,全局变量无法保证唯一性
  • 使用全局静态指针或静态成员指针,只有在使用时才会创建,线程不安全,需要自己处理多线程访问,可以提供销毁函数用于手动控制对象的销毁(如果后面有访问将会重新创建对象)
  • 使用本地静态指针,只有在使用时才会创建,C++11以上能保证线程安全,可以手动控制对象的销毁(如果后面有访问该对象程序将崩溃)

变量大总结

1.默认初始化,但其实内置变量如果没有特别处理,是不会初始化的,仅仅是在内存中占位声明。

unsigned count; // Default-initialized
unsigned count; // Default-initialized

你可能感兴趣的:(技术简谈,c++)