标签: C++

  1. 编程 » C++
    如果我们用std::getline或者简单的std::cin >>获取用户输入,有一个问题是,它会阻塞掉整个程序,用户必须有输入后才能继续执行。如果这个输入是单独的线程,它还会阻止整个程序的退出。
  2. 编程 » C++, C++标准库
    std::vector有两个大小:
  3. 编程 » C++, popen
    popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
  4. 编程 » C++, 编译链接
    最近升级系统,出现好多莫名其妙的问题。其中一个便是 G++编译后,发现其中一个动态链接库引用了绝对地址。正常情况下运行ldd bin/auto应该是下面的结果:
  5. 编程 » pytorch, C++
    目前 pytorch 已经升级到了 1.7.0 ,但在 ubuntu 20.04 下有一个非常诡异的 bug。为此,我们只能自己编译。
  6. 编程 » C++
    现在一般不能用 sprintf 和 strcpy ,推荐使用 snprintf 和 strncpy ,以防止缓冲区溢出:
  7. 编程 » C++, fmt
    C++的fmt::format格式化库,由于效率高,功能强大,相关的 API 已经进入C++20,但其文档和 API 细节无法恭维。
  8. 编程 » C++, 编译
    一个典型的 GCC C++编译过程为:
  9. 编程 » C++, GCC, 编译链接
    C++的链接分为两部分,一个是编译时,一个是运行时。但运行时的行为也收到编译参数的影响。
  10. 编程 » C++, assert, 异常处理
    1)在函数开始处检验传入参数的合法性
  11. 编程 » popen, C++
    我们在 C++里可以这么查看popen是否正常执行:
  12. 编程 » C++
    有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
  13. 编程 » C++
    假设在 C++里有一个数据结构:
  14. 编程 » C++, boost, 命令行
    我们用boost的命令行库program_options解析命令行,在解释布尔命令行时使用下面代码:
  15. 编程 » C++,
    C++的多行宏有标准定义方式,boostfolly库都采用了这种方式:
  16. 编程 » C++, 异步
    C++11 的标准异步库至少包含下面内容:
  17. 编程 » C++, 智能指针
    前面已经提到std::shared_ptr有三个缺陷:
  18. 编程 » C++, Boost, 智能指针
    如果理解了侵入式容器,侵入式智能指针也很容易理解。传统的智能指针std::shared_ptr使用了和数据无关的引用计数,这带来两个问题:
  19. 编程 » C++, Boost, 数据容器
    Boost.Intrusive 是一个很有意思的实现,里面实现了很多侵入式容器,在特定环境下,可以大大提升性能。
  20. 看到网上有片段,提到没有必要自己实现自旋锁,因为标准库的 std::mutex 和现在的自旋锁的实现没有两样。比较好奇,翻了一些资料,试图找到答案。
  21. 编程 » C++, 代码片段
    主要函数是timespec_get,可参考https://zh.cppreference.com/w/c/chrono/timespec_get
  22. 编程 » C++
    要在C++中运行系统命令,可以直接使用std::system函数:
  23. 由 Facebook 开发和维护的 C++库 Folly 提供了自旋锁的实现folly::MicroSpinLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/synchronization/MicroSpinLock.h
  24. 编程 » folly, C++, 数据容器
    由 Facebook 开发和维护的 C++库 Folly 提供folly::small_vector,代码文件地址:https://github.com/facebook/folly/blob/master/folly/small_vector.h
  25. std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
  26. 编程 » C++, gcc
    follyLikely.h文件提供了 LIKELY 和 UNLIKELY 宏,提示编译器在分支预测时选择分支。其实现很简单
  27. 编程 » C++, folly
    高效程序总是尽量避免频繁触碰在堆上分配和释放内存,所以无论是std::string还是folly:fbstring都做了SSO( small string optimization )。而folly::FixedString是一个很有意思的实现,它可以把任意长度的字符串都放在堆上。代码可见https://github.com/facebook/folly/blob/master/folly/FixedString.h
  28. 由 Facebook 开发和维护的 C++库 Folly 提供了锁folly::MicroLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/MicroLock.h
  29. 编程 » C++, C++标准库
    std::tuple的原理并不复杂,但有些细节非常有意思。其中有一个是至少在gnu C++ std的实现中,std::tuple是倒序存储的:
  30. 编程 » C++, 智能指针
    理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
  31. 编程 » C++, folly
    folly::fbstring是一个完全兼容std::string的类,可以做到无缝替换,而且性能更高。其代码参见https://github.com/facebook/folly/blob/master/folly/FBString.h
  32. 编程 » C++, 数据容器, folly
    folly::dynamic提供类似于C++的动态类型。和std::any可以容纳任意类型不一样,folly::dynamic只支持保存以下几种类型:
  33. 编程 » C++, 数据容器
    我们知道在javascript以及Python 3.6+中,所有的dict都保留了插入顺序。但在 C++中,无论是std::map还是std::unordered_map,都没有保留插入顺序。当遍历时,std::map得到的是一个根据键值排序的有序序列,而std::unordered_map则基本是乱序。
  34. 编程 » C++, 数据容器
    我们知道在javascript以及Python 3.6+中,所有的dict都保留了插入顺序。但在 C++中,无论是std::map还是std::unordered_map,都没有保留插入顺序。当遍历时,std::map得到的是一个根据键值排序的有序序列,而std::unordered_map则基本是乱序。
  35. 编程 » folly, C++, 数据容器
    由 Facebook 开发和维护的 C++库 Folly 提供folly::sorted_vector_setfolly::sorted_vector_map,是std::mapstd::set在小数据集上的优化版。代码见: https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h
  36. 编程 » folly, C++
    Folly 官方地址:https://github.com/facebook/folly
  37. 获取程序占用的内存量,是一个诡异的需求。但程序写多了,有时候还真需要,尤其是代码运行出现问题的时候。
  38. http://senlinzhan.github.io/2017/12/04/cpp-memory-order/ 写得最浅显易懂。记录一下以备查询。
  39. 出现的一个场景是将函数指针用 void
  40. boost是除std外最常用的 C++库,覆盖很多常用操作。目前最新的版本是1.59.0
  41. 编程 » C++, 算法, 代码片段
    一个短小、高效的 C++函数,用来判断指定日期是星期几:
  42. 编程 » C++, C++11
    花括号初始化是C++11引入的一种初始化方法。
  43. 编程 » C++, GCC, 编译链接
    LD 在链接生成目标文件时,会从左到有扫描输入的依赖库,当依赖库之间也有依赖关系时,必须将「依赖别人的库」放在「被别人依赖的库」的前面。否则会链接失败!失败的症状有:
  44. 最近老遇到一个奇怪的问题。在 VS 2013 编译时,爆出很多警告:
  45. 编程 » C++, 编译错误
    在 gcc 中,存在继承关系的模版类,子类无法直接访问父类的成员,即使该成员是protectedpublic
  46. 编程 » C++
    C++的浮点数转整数有四种方法,直接类型转换、round、floor、ceil。其效果如下表:
  47. C++内存检查和性能分析工具 valgrind里介绍了 valgrind 的安装,以及用于效率分析 profiler 工具。valgrind 最本来的功能是内存检查。这篇文章做简单的介绍。
  48. 一个好用的 C++性能分析工具需满足几个条件: