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