C++
盐焗咸鱼
这个作者很懒,什么都没留下…
展开
-
STL六大组件
一、STL六大组件STL提供六大组件,它们之间可以相互组合使用。1、容器(containers)容器用来存放数据,包括各种数据结构,如vector,list,deque,set,map等。从实现的角度来看,STL容器是一种class template。2、算法(algorithms)算法包括各种常用的sort,search,copy,erase, find等等。才实现的角度来看...原创 2019-01-10 15:12:27 · 2470 阅读 · 0 评论 -
右值引用和移动语义
右值引用和左值引用在c++当中,所有的变量和表达式都被分为左值和右值。所谓的左值,就是可以被寻址的非临时变量。右值就是无法被寻址的临时变量。左值引用用’&‘符号表示,右值引用用’&&‘符号表示。// 左值引用int n;int *np = new int;const int cn = 100;int & nr = n;int & npr ...原创 2019-02-19 16:11:13 · 373 阅读 · 0 评论 -
C++可变参数模板
使用可变参数模板可以生成可变个数参数的模板函数。模板参数包和函数参数包c++提供省略号来声明模板参数包的标识符。用“...”声明的标识符,将可以与多个类型匹配。用法如下:template<typename... Args>void foo(Args... args){}foo(2, 4, "c++", 'c', std::string("java"));Args...原创 2019-02-19 19:43:45 · 1092 阅读 · 0 评论 -
C++并发编程(三):线程间共享数据
避免恶性条件竞争双向链表具有前后两个链,当一个线程修改一个双向链表的前链还未来及修改后链时,另一个线程进行了数据访问,此时就会发生恶性条件竞争。多线程编程中,我们总会遇到多个线程对一个数据块进行修改,所以需要避免恶性条件竞争。避免恶性条件竞争有三个主要方法。1、对数据块进行加锁等数据保护机制。同一时间,只有一个线程可对数据进行修改操作。2、实现无锁化编程。对数据结构进行无锁化设计。...原创 2019-02-26 11:26:59 · 989 阅读 · 0 评论 -
C++并发编程(四):同步并发操作
使用条件变量等待线程c++提供了std::condition_variable和std::condition_variable_any来实现线程之间的条件等待,它们声明在<condition_variable>头文件。condition_variable必须和一个mutex互斥量来协同工作,condition_variable_any则可以任何互斥量一起工作,更加通用,但是开销和体...原创 2019-02-28 21:42:26 · 508 阅读 · 0 评论 -
c++报terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1错误
在线程编程时,编译器报terminate called after throwing an instance of 'std::system_error'terminate called recursively what(): Unknown error -1Aborted (core dumped)解决方法:在链接时,加上 -pthread选项。g++ -std=c++11 -p...原创 2019-02-26 17:29:02 · 14337 阅读 · 0 评论 -
C++并发编程(五):内存模型与原子类型
对象与内存位置1、内存模型C++内存模型可以被看作是C++程序和计算机系统(包括编译器,多核CPU等可能对程序进行乱序优化的软硬件)之间的契约,它规定了多个线程访问同一个内存地址时的语义,以及某个线程对内存地址的更新何时能被其它线程看见。2、对象与内存位置在一个C++程序中的所有数据都是由对象(objects)构成。像int或float这样的对象就是简单基本类型;当然,也有用户定义...原创 2019-03-03 15:18:37 · 403 阅读 · 0 评论 -
C++并发编程(六):内存顺序
原子操作的内存顺行有六个内存顺序选项可应用于对原子类型的操作:memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, 以及memory_order_seq_cst。除非你为特定的操作指定一个顺序选项,否则内存顺序选项对于所有原子类型...原创 2019-03-03 21:11:35 · 2631 阅读 · 3 评论 -
C++并发编程(七):同步操作与强制排序
同步发生与先行发生“同步发生”关系是指:只能在原子类型之间进行的操作。例如对一个数据结构进行操作(对互 斥量上锁),如果数据结构包含有原子类型,并且操作内部执行了一定的原子操作,那么这些操作就是同步发生关系。“先行发生”关系是一个程序中,它指定了某个操作去影响另一个操作。对于单线程来说,如果源码中操作A发生在操作B之前,那么A就先行与B发生。控制线程顺序假设你有两个线程,一个向数据...原创 2019-03-03 22:37:42 · 535 阅读 · 0 评论 -
C++并发编程(八):原子类型与数据竞争
非原子类型C/C++中所有的操作默认为非原子操作。非原子操作,并不保证操作的完整性。当一个操作由2个以上的指令完成时,操作可能只执行了一个指令,变量就被另外一个线程抢占。当多个线程同时读写同一个变量时,就会发生数据竞争。uint64_t i = 0;void foo(){ i = 1;}上述简单的赋值语句,通过一个32位的系统编译,这个操作就需要分别负责高32位和低...原创 2019-03-04 11:17:05 · 553 阅读 · 0 评论 -
CPU实现原子操作的方法
在学习并发编程时,我们知道,多条指令不被分割操作被成为原子操作。但是,对于CPU是如何保证原子性的呢。1、对于单核CPU对于单核cpu,所有的事件都是串行,执行完第一才会去执行第二个。所以,单核CPU实现原子操作比较简单。在单核CPU中,每个指令都保证是原子的,即中断只会在指令之间发生。Intel x86指令集支持内存操作数的inc操作,将多条指令的操作在一条指令内完成。因为进程的上下...原创 2019-03-14 22:39:18 · 2454 阅读 · 1 评论 -
虚函数的工作原理与类的大小
1、虚函数的作用虚函数通过动态联编技术,使程序运行时选择正确的虚方法。使用虚函数,会根据对象的类型来调用函数,而不是根据指针类型。#include<iostream>using namespace std;class A{public: A(){} virtual void show(){ cout << "this is A show" <...原创 2019-03-12 14:23:35 · 393 阅读 · 0 评论 -
虚基类和多继承
我们声明一个DancerSinger类,多继承于Dancer和Singer类。Dancer和Singer类继承与People类。#include <string>class People{private: std::string name; int age;public: People(); virtual ~People(); vo...原创 2019-02-18 10:25:11 · 401 阅读 · 2 评论 -
make命令参数
转自http://wiki.ubuntu.org.cnmake命令的参数意义下面列举了所有GNU make 3.80版的参数定义。其它版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文档。“-b”“-m”这两个参数的作用是忽略和其它版本make的兼容性。“-B”“--always-make”认为所有的目标都需要更新(重编译)。“-C <...原创 2019-02-12 11:44:37 · 2115 阅读 · 0 评论 -
Makefile自动化变量
转自http://wiki.ubuntu.org.cn自动化变量自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现在规则的命令中。下面是所有的自动化变量及其说明:$@表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。$%仅当目标是函数库文件中,表示规则中...原创 2019-02-12 11:39:07 · 172 阅读 · 0 评论 -
位运算符的妙用
平时学习和工作中遇到问题,很难第一时间就想到用位运算符来解决。但是有时使用位运算符会使代码和逻辑异常得简洁。下面会对平时遇到的一些位运算做个汇总记录。龟速更新~// 将bytes上调至ALIGN(ALIGN为2的指数倍)的倍数#define ALIGN 8static int ROUND_UP(int bytes){ return ((bytes + ALIGN - 1) &a...原创 2019-01-17 10:01:35 · 405 阅读 · 0 评论 -
C/C++中extern关键字用法详解
extern用于在多个文件中间中,定义一个全局变量或者函数。可以在其他文件中使用extern来得到一个已定义的变量或函数的引用。extern用于函数声明extern用于函数声明时,和普通的函数声明并没有区别。即extern int foo();和int foo();是一样的效果的。使用extern更多的是表示该函数在其他文件中定义。外部定义的函数一般都在 .h 文件中使用extern关...原创 2019-01-11 17:05:26 · 450 阅读 · 0 评论 -
C/C++中static关键字用法详解
static修饰函数和全局变量static关键字修饰的函数和全局变量只会在本文件可见,对外不可见。即其他文件无法访问本文件定义的函数,用extern无法获取到变量和函数的定义。通过用static修饰函数,我们可以在不同的文件定义多个同名的函数。static修饰局部变量static修饰的局部变量的内存不会开辟在栈上,而是开辟在静态变量区。即和全局变量一个区域,只有程序结束时,内存才会释放...原创 2019-01-11 19:46:52 · 454 阅读 · 0 评论 -
C/C++中vloatile关键字用法
vloatile关键字的作用,是告诉编译器不对变量使用优化。即编译后的程序在读写这个变量的时候,都会从变量的地址直接进行值的读写。int i = 0;int a,b;a = i;/** 中间代码段*/b = i;编译器在进行编译时,有时会对变量进行优化,直接从寄存器中读值,从而加快读取速度。如上述代码,编译器如果在中间代码段没有检测到对i值的修改操作,便会将上次读取的i...原创 2019-01-14 10:56:09 · 487 阅读 · 0 评论 -
C++中::作用域运算符用法详解
使用::作用域运算符,可以让你的代码减少出错的概率。今天在读空间配置器接口时,看到了如下代码。template <class T>inline T* _allocate(ptrdiff_t size, T*){ set_new_handler(0); T* tmp = (T*)(::opterator new(size_t)(size * sizeof(T)))...原创 2019-01-14 17:25:40 · 5679 阅读 · 0 评论 -
利用union减小链表维护的内存开销
union是一种特殊的结构,每次只有一个活跃的成员。其占用的内存大小为最大的成员大小,并且这些成员共享同一片内存空间。union实现了多个成员选其一的功能(n个成员只保存一个)。union的使用1、联合体能拥有成员函数(包含构造函数和析构函数),但不能有虚函数。若联合体含带非平凡特殊成员函数(复制/移动构造函数、复制/移动赋值或析构函数)的数据成员,则联合体中该函数默认为被删除,且需要程序...原创 2019-01-21 15:57:07 · 440 阅读 · 0 评论 -
强类型与弱类型、静态类型与动态类型概念
网上关于类型的概念貌似十分得模糊,众说纷纭。也有大神说类型是没有定义的,静态和动态类型的概念本身就是不存在。下面只是整理一些网上主流的概念和些许自己的理解。首先介绍一些概念1、Program Errorstrapped errors。 可以被程序捕获的错误,程序捕获会终止运行。如除0操作,Java中数组越界等。untrapped errors。出错后,程序无法知晓,会继续运行,直到...原创 2019-01-16 16:49:49 · 256 阅读 · 0 评论 -
复制构造函数和赋值运算符
进行c++类设计时,如果不对复制构造函数和赋值运算符进行重写的话,编译器会默认调用默认函数。默认的复制构造函数和赋值运算符会造成许多问题。先看下面一段代码。#include <iostream>#include <cstring>class My_string{private: char* str; int len; static int...原创 2019-02-14 17:36:48 · 227 阅读 · 0 评论 -
C++成员初始化列表
类的成员变量一般在构造函数调用之前就被创建,当我们的类中有常量,或者引用变量时,我们无法在构造函数中对常量进行赋值。class Queue{private: int* front; int* rear; const int size; int & foo;public: Queue(int, int&); ~Queue();...原创 2019-02-15 11:34:39 · 310 阅读 · 0 评论 -
C++并发编程(一):并发与并行,一个简单的多线程例子
并发与并行并发:多个任务可以同时存在。程序在逻辑上可以实现多个任务同时存在,那么这个程序就是并发程序。并发程序在物理实现上既可以是并行,也可以是串行。串行:单个处理器通过“任务切换”的方式,在一秒之内进行多次任务切换,给人一种任务并发的错觉。同一时间只有一个任务得到处理。并行:多个任务在多个处理器中同时运行。多个任务在同一时间一起得到处理。多进程并发与多线程并发多进程并发:将应...原创 2019-02-22 14:34:18 · 4848 阅读 · 0 评论 -
C++并发编程(二):线程管理
启动线程thread类的构造函数接收一个可调用的类型。可调用的类型,除了函数,还可以是函数对象和lamda表达式。class foo{public: void operator() (){ for(int i = 0 ; i < 5; i++) std::cout << "foo concurrent \n"; ...原创 2019-02-22 21:44:23 · 327 阅读 · 0 评论 -
C++ 链接时提示类的静态变量未定义,“undefined reference to”错误
今天在工程中写了一个单例,但是调用时,总是报静态变量未定义的错误。// A.hclass FWindowsLoader : public FPhysicalLoader{private: FWindowsLoader(){} static FWindowsLoader* singleFWindowsLoader;public: static FWindowsL...原创 2019-07-09 14:27:22 · 6837 阅读 · 2 评论