
c/c++
文章平均质量分 86
一起学习c++
D_Guco
it互联网/游戏
展开
-
多核时代下线程间的内存可见性
多核时代下线程间的内存可见性原创 2024-08-23 18:05:45 · 603 阅读 · 0 评论 -
红黑树hashmap-RbtHashMap实现
基于红黑树的固定长度的hashmap实现,对c++标准库map的进一步优化原创 2022-05-22 13:39:41 · 606 阅读 · 0 评论 -
内存的申请和释放
内存的申请和释放,malloc,free干了什么,delete[]和delete的区别原创 2021-12-25 19:27:48 · 2614 阅读 · 0 评论 -
固定长度hashmap实现
固定长度的hashmap代码实现原创 2021-09-21 17:16:01 · 1431 阅读 · 0 评论 -
lua和c++交互
交互原理Lua教程:绑定一个简单的C++类(6)Lua教程:C/C++操作Lua数组和字符串(5)Lua教程:Lua调用C/C++函数(4)Lua教程:C/C++调用Lua的Table(3)Lua教程:C++和Lua相互传递数据(2)Lua教程: C++嵌入Lua脚本(1)原创 2021-07-24 15:46:07 · 1369 阅读 · 0 评论 -
检测指针被意外写坏
如何检测指针被意外写坏原创 2021-02-28 13:53:23 · 503 阅读 · 2 评论 -
分析libevent 内部运行流程
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。 实际上Libevent只是对epol...原创 2020-07-12 18:36:41 · 686 阅读 · 0 评论 -
c++反射实现方案的选择
由于c++原生不支持反射,绝大多数情况也不需要反射,但是有些时候如果通过反射会避免大量的重复无用的代码。原创 2020-06-14 17:19:20 · 2140 阅读 · 2 评论 -
dynamic_cast背着你偷偷做了什么
c++常用的四中转换类型我们都很清楚,分别是下面四中 1const_cast const_cast<目标类型>(标识符):目标类型只能是指针或者引用2static_cast类似C风格的强制转换,进行无条件转换,静态类型转换:1)基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安全的(基类和子类之间的动态类型转换建议用dynamic_cast)。2)基本数据类型转换,enum,struct,int,char,float等。static_cast原创 2020-05-10 13:11:09 · 1028 阅读 · 0 评论 -
c++后台开发知识点收藏
收藏一些后台开发相关的知识点1 linux系统 https://blog.youkuaiyun.com/ThinkWon/article/details/1045886792mysql数据库https://thinkwon.blog.youkuaiyun.com/article/details/1047786213 redis数据库https://thinkwon.blog.youkuaiyun.com/art...原创 2020-04-10 15:51:48 · 375 阅读 · 2 评论 -
c++ 空基类优化
我们知道c++中一个空类的大小为1个字节,那么如果一个空类作为基类或者成员对象的时候会怎样呢,是不是还是一定占用1个字节呢? c++中为保证同一类型的不同对象地址始终有别,要求任何对象或成员子对象,即使该类型是空的类类型(即没有非静态数据成员的 class 或 struct)也是如此。然而,基类子对象不受这种制约,而且可以完全从对象布局中被优化掉,若空基类之一亦为首个非静态数据成...原创 2020-03-25 21:15:56 · 644 阅读 · 0 评论 -
基于skiplist实现高效的排行算法(redis zset)
首先什么是skiplist,在往下看之前先看一下下面几篇文章吧 我之前写的一篇关于skipList的文章 深入理解skiplist 了解skiplist后我们说道排行榜,排行榜实际上就是一种排序算法,常见的排序算法就是二叉树系列,红黑树,最小堆,最大堆等等,虽然他们可以提供排序功能,它们要找到一个值也很快,但是要想知道这个值排名第几,似乎只能按照先序遍历的方式来...原创 2020-01-12 22:26:28 · 1370 阅读 · 2 评论 -
记一个被自己忽略的知识点(指针本身的长度到底由什么决定)
通常我们计算指针的长度会用到sizeof(void*),我一直片面的任务指针的大小和int类型的大小是一样的,但是在一次core dump崩溃调试的过程中看到一个指针的长度竟然是64位的就以为指针是个野指针,但是最后发现问题不在那里,指针是正确的,这我才进一步的了解了指针大小到底是由系统什么因素决定的。 首先我们说下数据总线和地址总线 1)地址总线 地址总线决...原创 2019-12-30 11:39:29 · 793 阅读 · 0 评论 -
重载new和delete来检测内存泄漏导致placement new操作符不能使用解决办法
为了检测内存泄露,重载new和delete来检测内存泄漏结果导致placement new操作符不能使用。 void *operator new(size_t size, const char *file, unsigned int line) { void *ptr = malloc(size); printf("Call new in [%s]:%d allocate %...原创 2019-10-07 14:03:20 · 418 阅读 · 0 评论 -
关于智能指针的一个疑问
c++中最大的问题就是内存管理问题也就是指针,当一个指针在程序中到处传的时候,经常会出现多次销毁,或者用到一个已经被释放的指针(野指针),特别是在多线程中这种情况更加难以处理,根本不知道什么时候会在哪个线程中被释放,虽然c++11中的智能指针有效的解决了这个问题,在很大程度上简化了内存管理的难度,但是使用不当还是会导致程序崩溃,比如你在使用的时候把一个智能指针reset或者把nullpt...原创 2019-06-22 13:07:09 · 1231 阅读 · 0 评论 -
C++内存模型和原子类型操作
c++ memory order 内存序原创 2019-03-10 14:02:24 · 1002 阅读 · 0 评论 -
c++ 线程局部变量thread_local
c++11 中添加了新的关键字thread_local,用来声明新的存储期(线程存储期变量),即线程局部变量。 存储类指定符是名称声明语法的 decl-specifier-seq 的一部分。与名称的作用域一同,它们控制名称的二个独立属性:其“存储期”与其“链接”。auto - 自动存储期(C++11 起)。register - 自动存储期。亦提示编译器将此对象置于处理器的寄存器。C...原创 2019-01-20 17:25:38 · 10115 阅读 · 0 评论 -
关于smart pointers(智能指针)你必须知道的事
1 shared_ptr禁止了隐式转换(explict),不能把一个指针赋值给shared_ptr. 例:shared_ptr<string> pNico = new string("nico");2 make_shared初始化shared_ptr要比调用shared_ptr构造函数更快更安全,:shared_ptr<string> pJutta = make_sh...原创 2018-12-16 19:05:29 · 559 阅读 · 0 评论 -
当虚析构函数遇上智能指针
首先我们知道,当一个父类指针指向一个子类对象的时候,如果析构函数为非虚函数的话那么此时对象只会释放父类对象的内存,而子类对象部分就会放生内存泄漏,换句话说就是只会调用父类的构造函数不会调用子类的构造函数。原因很简单,你通过一个父类指针指向了一个子类对象,在调用析构函数的时候此时指针类型为父类所以仅仅调用了父类的析构函数,但是如果析构函数是虚函数,情况就不一样了,虚函数是有多态性质的,当调用析...原创 2018-07-22 22:59:57 · 2857 阅读 · 1 评论 -
c++11 编译时类型判断
c++11中有一个特殊的模板类integral_constant,首先看实现: template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp ...原创 2018-06-24 18:26:46 · 6255 阅读 · 0 评论 -
shared_ptr的线程安全性
shared_ptr的出现在某种程度上解放了c++程序员,c++11标准原生的支持了并发编程,在并发编程中shared_ptr的线程安全问题如何保证呢?先撇开shared_ptr对象的线程安全性,先看shared_ptr本身的线程安全问题。 我们知道,shared_ptr的底层实现原理是引用计数,关于这个计数是否线程安全呢,如果我们把shared_ptr分别传递到不同的线程中,是否会...原创 2018-05-01 17:47:06 · 10260 阅读 · 0 评论 -
c++11 新特性一览
下面我们简单的对c++11的特性进行一个整体的了解,这里我只根据自己平时所用的和所了解的,简单介绍其作用,具体的感兴趣的可以搜索一下关键字,问度娘进行进一步的了解。 long long 类型:新增的数据类型 列表初始化 : 允许变量用{}初始化,对于stl容器很方便 nullptr常量:为了统一大家判定指针为空的写法习惯,有些写法在特定情况下会有问题:点击打开链接 constexp...原创 2018-04-22 20:50:38 · 684 阅读 · 0 评论 -
copy-on-write 在c++ std::string中的应用
一 简介 Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.总的来说,COW通过浅拷贝(shallow copy)只复制引用而避免复制值;当的确需要进行写入操作时,首先进行值拷贝,再对拷贝后的值执行写入操作,这样...原创 2018-04-07 17:48:56 · 4398 阅读 · 2 评论 -
c++拷贝控制
拷贝作为内存管理的最常的行为操作,c++中很多隐藏的内存问题和bug都是由于不正确的拷贝行为引发的,这里我们以最基本的拷贝构造函数,拷贝赋值运算符和析构函数作为切入点来谈一谈如何正确的进行c++的拷贝控制。 拷贝构造函数:如果一个构造函数的第一个参数时自身的引用(通常是const引用),且任何额外的参数都有默认值,则称作拷贝构造函数,如果我们没有定义拷贝构造函数编译器会在需要的时候为我们生成原创 2017-12-23 12:28:15 · 1579 阅读 · 0 评论 -
C++模板元编程
所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得异常灵活,能实现很多高级动态语言才有的特性(语法上可能比较丑陋,一些历史原因见下文)。普通用户对 C++ 模板的使用可能不是很频繁,大致限于泛型编程,但一些系统级的代码,尤其是对通用性、性能要求极高的基础库(如 STL、Boost)几乎不可避免的都大量地使用 C++ 模板,一个稍有规原创 2017-12-17 18:07:41 · 2365 阅读 · 0 评论 -
c++ 一百问
1 比较c和c++?2 如何理解面向对象?3 接口与实现的分离有什么好处?4 继承是否会削弱封装机制?6 如何理解动态特性?7 如何理解类和对象?8 如何理解对象的初始化?9 如何理解对象的生存周期? 10 编写C++类时需要注意哪些问题?11 如何理解构造函数?12 默认构造函数是什么,它有什么特点?13 何时调用拷贝构造函数?14 深拷贝与浅拷原创 2017-10-14 17:36:46 · 797 阅读 · 0 评论 -
c++实现skipList
Skip List是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。Skip List可以很好解决有序链表查找特定值的困难。 跳表是平衡树的一种替代的数...原创 2017-09-16 17:16:57 · 2255 阅读 · 4 评论 -
c++循环引用
虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。//// main.cpp// test//// Created by 杜国超 on 17/9/9.// Copyright © 2017年 杜国超. All rights reserved.//#include #in原创 2017-09-09 21:21:47 · 2505 阅读 · 0 评论 -
c++ const的各种用法
const限定符1.定义const对象熟悉的形式 const int bufSize = 512; 变量bufSize仍然是个左值,但是不能修改的,因为常量在定义后就不能修改,所以定义时必须初始化:const std::string hi = "hello!"; /**ok*/const int aaa = 125; /**ok原创 2017-08-27 11:36:29 · 1615 阅读 · 2 评论 -
c++11 map和unordered_map
c++11 map,set和unorderedmap,unorderedset原创 2017-08-23 16:44:26 · 4716 阅读 · 0 评论 -
c++ RTTI机制和类型转化
RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息。它提供了运行时确定对象类型的方法。C++数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知...原创 2017-08-06 18:48:49 · 1459 阅读 · 0 评论 -
用内存池管理c++对象
当一个系统中 ,有一些对象需要频繁的申请和释放时,为了提高性能我们通常用内存池来管理这部分对象,这里给一个内存池的实现,我们用双向链表和数组实现内存池来管理c++对象。 内存池类 //// mempool.h// Created by DGuco on 17/7/29.// Copyright © 2017年 DGuco. All rights reserved原创 2017-07-29 13:55:49 · 2247 阅读 · 1 评论 -
c++ 性能优化策略
1 关于继承:不可否认良好的抽象设计可以让程序更清晰,代码更看起来更好,但是她也是有损失的,在继承体系中子类的创建会调用父类的构造函数,销毁时会调用父类的析构函数,这种消耗会随着继承的深度直线上升,所以不要过度的抽象和继承,更为严重的是当多重继承中并且有虚函数的存在时情况更为复杂,的确,这些问题涉及开销,但是,多重继承减少了编码的负担,同时也让问题的解决方案更加简洁,这当然要付出一些代价.总之,与...原创 2017-07-22 17:27:19 · 10270 阅读 · 11 评论 -
atomic和volatile的操作的原子性
c++11提供了atomic来实现无锁并发数据结构,用起来很简单。 #include #include #include #include using namespace std;//std::mutex mu_lock;//int num = 0;std::atomic num(0);void testThread1(){ for ...原创 2017-07-09 16:49:47 · 7035 阅读 · 0 评论 -
c++11 多线程基础
在c++11中,c++标准库中就增加了关于多线程的一些操作,在此之前我们不得不调用系统底层的多线程函数,或者用第三方的线程库,多少还是有些不便,现在我们可以用标准库中的多线程函数来开发多线程程序了。下面就介绍一下基本的用法。#include #include void thread_test(int a,int b){ std::cout << "thread_test:a +原创 2017-06-04 16:37:23 · 874 阅读 · 0 评论 -
c++11异步编程
c++11异步编程原创 2017-04-23 17:26:14 · 10458 阅读 · 0 评论 -
c++11之智能指针
c++11之智能指针原创 2017-04-15 19:50:10 · 2440 阅读 · 2 评论 -
c++11之move语义
#include using namespace std; class HasPtrMem { public: HasPtrMem() : m_ptInt(new int(0)) { std::cout << "HasPtrMem::Construct:" << ++n_cstr <g++ movecopy.cpp -o movecopy-fno-e...原创 2017-03-25 19:00:10 · 2573 阅读 · 0 评论 -
c++11之左值引用和右值引用
c++11中增加了右值引用和move语义来避免一些不必要的构造和copy操作,以此来提升程序的运行效率。首先说左值和右值,他们绝不是简单的等号左边和右边的区别,总结来说: 1 .左值可以寻址,而右值不可以。 2 .左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。 3 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。 例:int...原创 2017-03-19 18:39:41 · 4878 阅读 · 1 评论 -
c++的点点滴滴
说实话c++是一门极其复杂的语言,要想学好不是一朝一夕的事,是一个逐渐积累的过程,在这里分享一些我看过的认为一些c++中比较重要的,或者写的比较优秀的c++文章或者博客,暂时这么多,来日方长慢慢补充。1.如何学习c++:点击打开链接,推荐了一些c++书籍。2. c++拷贝构造函数详解:点击打开链接,这里补充一点拷贝构造函数参数为什么必须是引用类型,引用是为了防止拷贝构造函数无限递归,最终导致栈溢出...原创 2017-03-03 10:11:25 · 1555 阅读 · 1 评论