std::bind 和 std::thread 传引用的那些事
std::bind 和 std::thread 传引用的那些事
|
C++ |
0 评论
前言在 std::bind 和 std::thread 中可能会遇到引用失效的问题,解决办法是通过 std::ref 传递引用。这通常不是什么难的技术问题,但是知其然知其所以然,为什么这样设计,也许值得深入探讨一下。引用失效的情况在以下两种情况下,引用可能失效,仍然导致拷贝操作std::bindst
C++ 内存模型深入解析
C++ 内存模型深入解析
|
C++ |
C++
0 评论
C++ 内存模型深入解析前言C++ 内存模型所聚焦的问题在于一个 C++ 对象在内存中是如何编排的,各种类内数据及方法,是如何存储在内存中的,以及模型是如何适配继承体系的。本文有大量例程进行验证和说明,需要花一定时间阅读,也推荐读者在自己的机器上进行试验和验证。本文中程序所用编译器为 clang 1
C++11 多线程入门
C++11 多线程入门
|
C++ |
0 评论
前言本文不赘述操作系统中多线程的相关知识,只讲述了 C++11 中关于多线程库的一些使用和说明。线程的创建及入口函数线程的入口函数传入一共有三种方法:普通函数成员函数仿函数#include <thread>using namespace std;// 1. 普通函数void func(i
C++ 内存泄露检测小工具
C++ 内存泄露检测小工具
|
0 评论
前言内存泄露一直是 C++ 的一个痛点,内存泄露的检测和定位是一件非常麻烦的事,这个小工具通过重载 new 和 delete 来检测内存泄露,但由于种种问题,难以做到跨文件,所以实际意义并不大。单文件的内存泄露通常很容易发现和定位,该小工具基本只能作为玩具轮子做着玩,实际上基本用不到,但写都写了,权
源码分析:dbg-macro 完全解析
源码分析:dbg-macro 完全解析
|
前言为了实现强大的 debug 信息,例如变量类型、变量信息、自动打印容器内元素等等功能,这部分需要获取到编译信息,正常手段应该很难获取到,要借助编译器,就只能利用模板元编程和宏来实现。所以该库的核心就是 宏 和 模板元编程 。所以阅读源码需要你对宏和模板元编程有一定了解,特别是 type_trai
C++ 黑魔法初探:boost 库 is_detected
C++ 黑魔法初探:boost 库 is_detected
|
前言在阅读 github 上一些库的源代码时,看到一个很有趣的实现,如何检测一个类型是否是容器,源代码是通过检测类型是否支持 begin、end、size 操作来判断。由于标准库并没有 is_detected 这一实现,所以库作者基本是把 boost 库中的源代码搬了过来,第一次看到时还花了好久时间
C++ 可调用对象返回值类型推导
C++ 可调用对象返回值类型推导
|
类型萃取获得返回值类型这里用到了模板元编程技术,标准库中有现成的实现 std::result_of,原理是这样的:我们通过 decltype(f(args)) 来获得返回类型,那么就得有函数 f 的类型和参数 args 的类型类型萃取设计如下:// 不会使用该版本template<typena
C++ 头文件的循环引用
C++ 头文件的循环引用
|
C++ |
C++
0 评论
前言在实现设计模式中的观察者模式时,想要完成的功能是:被观察者数据改变时通知观察者,而观察者能够知悉是哪些数据发生了改变(被观察者作为参数传递)这里就产生了循环引用,被观察者中包含了观察者,而观察者也包含了被观察者,导致出错。解决方案:前向声明在形如以下的循环引用结构,可以通过前向声明解决// A.
C++ 继承中方法调用总结
C++ 继承中方法调用总结
|
C++ |
0 评论
C++ 继承中方法调用总结前言C++ 的继承和多态无疑是一个非常有用的特性,但在实际使用过程中,有一些新手十分容易犯的错误,这里做个整理和总结,列举了继承下各种函数声明及实际调用情况。类说明用于演示的类如下:class Father{public:    void speak();};class S
C++STL常用数据结构及操作
C++STL常用数据结构及操作
|
0 评论
前言本文的整理针对平常做算法题比较常用的数据结构和操作,并不适用于平常工程或项目。大部分算法题涉及到的数据结构并不复杂,所以本文整理的数据结构都是比较基础的操作,适合忘记怎么操作的时候看一眼。vector-动态数组定义在头文件vector中初始化:vector<type> vec:无元素