
C/C++
游戏猫
多年游戏开发经验,在这里分享经验和心得
展开
-
unique_lock使用示例、源码分析
一、概要unique_lock实现了lock_guard类似的功能,但unique_lock保证了只有一个unique_lock拥有mutex,同时提供了转移拥有权的接口。二、代码示例#pragma once#include <mutex>#include <thread>#include <iostream>using namespace std;class UniqueLockTest{private: mutex _mutex; int co原创 2020-07-18 00:06:34 · 553 阅读 · 3 评论 -
lock_guard原理解析
一、说明lock_guard用来包装Mutex,实现Mutex的自动锁定和解锁。能保证锁定过程中逻辑异常也能自动解锁。二、windows下的源码template<class _Mutex> class lock_guard<_Mutex> { // specialization for a single mutexpublic: typedef _Mutex mutex_type; explicit lock_guard(_Mutex& _Mtx) //传的原创 2020-07-16 00:21:01 · 1751 阅读 · 0 评论 -
promise使用示例
一、概要promise实现跨线程设置和获取值,底层使用了mutex来保证设置值的原子性,通过future实现了跨线程等待获取结果。二、代码#pragma once#include <future>#include <thread>#include <chrono>#include <iostream>using namespace std;class PromiseTest{private: promise<int> p;原创 2020-07-14 00:06:25 · 235 阅读 · 0 评论 -
C++future、async使用示例
一、概述async可以启动一个线程(不保证)来处理逻辑,async调用后悔返回一个future,通过future可以用来等待处理完成或查看处理进度。二、代码#pragma once#include <future>#include <chrono>using namespace std;class AsyncTest{private: int count = 0; int maxLoop = 2000000000;public: int process()原创 2020-07-13 00:57:06 · 642 阅读 · 0 评论 -
SpinLock源码
一、概要spinLock的基本原理是如果发现其他人锁着,就一直循环,知道其他人解锁后,再上锁。一般SpinLock适用于锁的时间很短的情况,通过不断判定是否可以加锁,避免适用Mutex这类操作系统锁带来不能锁定时的上下文切换。二、实现源码#pragma once#include <atomic>#include <thread>using namespace std;class SpinLock{private: atomic<bool> _flag;原创 2020-07-12 01:29:39 · 346 阅读 · 1 评论 -
结构体、类、虚函数的内存大小
一、概要C++里结构体和类除了默认访问不一样外,其他基本是一样的,结构体可以有函数甚至是虚函数,所以内存大小上也是一样。但内存的大小不是简单地把所有成员变量的大小加起来就可以,需要考虑对齐、虚函数等,具体看测试的结果。二、测试代码#pragma once#include "stdafx.h"#include <stdio.h>class MemoryClassAlign0{ char a;};class MemoryClassAlign1{ char a; char c原创 2020-07-12 00:40:33 · 1304 阅读 · 0 评论 -
Atomic、Mutex性能测试
一、结论1、Atomic、Mutex相对于不加锁有较大的性能差别。2、Mutex的性能开销是Atomic的两倍左右。二、测试代码#pragma once#include <atomic>#include <thread>#include <chrono>using namespace std;class AtomicTest{private: atomic<long long> atomicCount=0; long long nor原创 2020-07-10 00:32:19 · 762 阅读 · 0 评论 -
shared_ptr实现机制
一、概述shared_ptr实现了引用计数的功能,在引用计数为0时,自动delete掉管理的对象。二、实现要点shared_ptr需要实现构造对象以及赋值时的计数。shared_ptr需要实现自身销毁时的计数减少。需要实现计数为0时自动销毁管理的对象。需要实现std::move语义。要处理多线程下的计数问题。三、shared_ptr的简单实现源码#pragma once#include <memory>#include <atomic>using name原创 2020-07-08 01:25:15 · 798 阅读 · 0 评论 -
IO多路复用之select详解
一、select用户select是 I/O多路复用系统函数,用来等待文件描述符状态的改变。它会一直阻塞,直到一个或多个文件描述符集合称为就绪态或者指定一个超时时间。它不适合文件数量庞大、I/0流量频繁的时候,它会随着fd的数量增大性能下降明显。二、接口windows定义:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout)linux定义:原创 2020-05-22 01:55:04 · 1473 阅读 · 0 评论 -
c++的virtual和override作用
一、概述c++的virtual提供了运行时的多态,是的可以用基类的指针调用子类对象的函数,通过override可以强制要求基类有对应的虚函数。二、测试代码#pragma once#include <stdio.h>class Base{public: void A_1() { printf("Base::A_1\n"); }; virtual void A...原创 2020-04-13 23:06:23 · 6550 阅读 · 1 评论 -
C++vector、unorderd_map,C# List Dictionary扩容策略
C++vector0 1 2 3 4 6 9 13 19 28 42 63 94 141 211 316 474 711 1066 1599 2398 3597 5395 8092 12138 18207 27310 40965 61447 92170 138255 207382 311073 466609 699913 1049869 1574803 2362204 3543306 5314...原创 2020-03-08 19:25:34 · 459 阅读 · 0 评论 -
C++条件变量condition_variable使用方法
一、条件变量概述条件变量可以实现一个线程唤醒一个或多个其他等待中的线程,实现线程间的同步。生产者消费者模型就可以用条件变量来实现。二、条件变量示例源码#pragma once#include <mutex>#include <condition_variable>#include <chrono>#include <queue>us...原创 2020-03-01 10:15:45 · 979 阅读 · 0 评论 -
c++ 互斥锁mutex使用方法
#pragma once#include <mutex>#include <thread>#include <iostream>using namespace std;class MutexTest{private: static mutex _mutex; static int _val1; static int _val2;public...原创 2020-02-28 00:27:03 · 660 阅读 · 0 评论 -
c++ priority_queue使用方法
#pragma once#include < queue >#include < iostream >using namespace std;class PriorityQueueTest{public:void DoTest(){std::priority_queue t = std::priority_queue(); //采用的是最大堆t.push...原创 2020-02-27 00:07:56 · 174 阅读 · 1 评论 -
c++ queue使用方法
#pragma once#include < queue >#include < iostream >using namespace std;class QueueTest{public:void DoTest(){std::queue t = std::queue(); //vector构造t.push(11); //添加元素,和list,vector...原创 2020-02-26 23:54:55 · 527 阅读 · 0 评论 -
c++ map使用方法
#pragma once#include < map >#include < iostream >using namespace std;class MapTest{public:void DoTest(){map<int,int> t = map<int,int>();t.insert({ 2,11 });t.insert(p...原创 2020-02-26 23:30:41 · 158 阅读 · 0 评论 -
c++ set用法
#pragma once#include #include using namespace std;class SetTest{public:void DoTest(){set t = set();t.insert(2);t.insert(3);t.insert(2);t.insert(4);t.erase(3);for (set::iterator it = t.b...原创 2020-02-26 22:58:20 · 142 阅读 · 0 评论 -
c++ stack用法
#pragma once#include < stack >#include < iostream >using namespace std;class StackTest{public:void DoTest(){std::stack t = std::stack(); //vector构造t.push(11); //添加元素,和list,vector...原创 2020-02-26 21:02:54 · 305 阅读 · 0 评论 -
c++ list的用法
#pragma once#include < list >#include < iostream >using namespace std;class ListTest{public:void DoTest(){list t = list();t.push_back(11); //添加元素t.push_back(22);t.push_back(33)...原创 2020-02-26 20:43:07 · 283 阅读 · 0 评论 -
c++ vector使用方法
#pragma once#include #include using namespace std;class VectorTest{public:void DoTest(){std::vector t = std::vector(); //vector构造t.push_back(11); //添加元素t.push_back(22);t.push_back(33);fun...原创 2020-02-26 20:25:59 · 197 阅读 · 0 评论 -
C++函数指针的三种定义方法
一、C的函数指针定义方法定义一个两个int参数,一个int返回值的函数指针类型typedef int (*func)(int,int)定义一个两个int参数,一个int返回值的函数指针int (*a)(int,int)二、C++的函数指针定义方法function<int(a,b)> a三、实践#pragma once#include #include using...原创 2019-11-01 23:52:06 · 4635 阅读 · 0 评论 -
shared_ptr原理和使用
一、原理为了避免new了对象后忘记delete,或者对象的销毁时机不确定,通过shared_ptr可以自动销毁没有被引用的对象。二、注意点shared_ptr并不能解决循环引用的问题,如果有循环引用,不能自动delete指向的对象。三、测试#pragma once#include <memory>#include <iostream>using namesp...原创 2019-11-01 23:22:47 · 1213 阅读 · 0 评论 -
C++字符串和基本类型转换的各种方法总结
一、概述1、C++中提供了字符串到基本类型转换的函数,在Windows下也提供了对应的基本类型到字符串转换的函数(在Linux没有,所以需要跨平台时不能使用)。2、字符串到基本类型转换的接口包括atoi(字符串转int),atol(字符串转long),_atoi64(字符串转long long,注意前面有下滑线),atof(字符串转double);非数字字符串转换时,不会抛异常或奔原创 2017-01-16 19:57:56 · 1776 阅读 · 0 评论 -
C++堆和栈分配
一、结论1、用new或molloc分配的在堆上。2、没用new或molloc,如果是在函数内定义的普通变量(非staic,非const),那么是在栈上分配,如果做为类或结构体的成员,类或结构体在哪里分配,成员变量就在哪里分配。二、定义方法 1、基础类型 int a; char c; 2、指针类型 int* a; char* c; 3、对象 Class1 c1;原创 2017-01-11 20:38:23 · 555 阅读 · 0 评论 -
C++const四种用法
一、用const修饰函数参数1、修饰指针,可以防止指针被修改void test(const ClassA* a){ ClassA** b = &a; //编译错误,不能对const指针取地址 ClassA* c = a; //编译错误,不能将const指针转普通指针 (*b) = new ClassA();}void test2(ClassA* a){ Cla原创 2016-12-23 14:09:26 · 12612 阅读 · 6 评论 -
C++中static用法总结
C++中可以用static修饰变量和函数一、用static修饰变量1、类外静态变量 方法: static int staticA = 0; 用途: 可以写在.h文件,也可以写在.cpp文件,该语句既是声明也是定义,该变量的作用域都仅限于cpp文件。 可以在多个cpp文件里定义相同的变量名;也可以在一个h文件里定义,在多个cpp文件里包含这个h文件。2、类内静态变量原创 2016-12-23 14:07:05 · 1006 阅读 · 0 评论