标签: C++

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