
C++
文章平均质量分 82
燕山暮雪
人生在世,唯篮球和代码不可辜负
展开
-
VS生成事件常用的宏
以下内容是具体宏说明:VS预生成事件命令行 和 生成后事件命令行宏说明$(ConfigurationName) 当前项目配置的名称(例如,“Debug|Any CPU”)。$(OutDir) 输出文件目录的路径,相对于项目目录。这解析为“输出目录”属性的值。它包括尾部的反斜杠“\”。$(DevEnvDir) Visual Studio 2005 的安装目录(...原创 2022-01-19 19:05:34 · 986 阅读 · 0 评论 -
使用Windbg分析C++虚函数表原理
要想学好C++,就得熟悉C++对象模型。如果能利用好调试工具,比如windbg、GDB等,就能够更快速的掌握C++对象模型原理。本系列文章是通过windbg来深入分析C++对象原理,以便更好的理解C++相关知识点。原创 2021-12-17 10:05:10 · 834 阅读 · 0 评论 -
C++中的lambda表达式和函数对象
lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读。但是从本质上来讲,lambda表达式只是一种语法糖,因为所有其能完成的工作都可以用其它稍微复杂的代码来实现。但是它简便的语法却给C++带来了深远的影响。如果从广义上说,lamdba表达式产生的是函数对象。在类中,可以重载函数调用运算符(),此时类的对象可以将具有类似函数的行为,我们称这些对象为函数对象(Function Object)或者仿函数(Functor)。相原创 2021-12-01 20:07:11 · 1406 阅读 · 0 评论 -
函数包装器
• 类模板声明// MS C++ 2013template<class _Fty> class function;template<class _Fty> class function : public _Get_function_impl<_Fty>::type { ... }// GCC 4.8.2template<typename _Signature> class function;template&原创 2021-12-01 19:57:13 · 297 阅读 · 0 评论 -
图说C++对象模型:对象内存布局详解
0.前言文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。文章如果有解释不清、解释不通或疏漏的地方,恳请指出。1.何为C++对象模型?引用《深度探索C++对象模型》这本书中的话:有两个概念可以解释C++对象模型:语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。直接支持面向对象程序设计,包括了构造函数、析构函数、原创 2021-11-30 14:29:24 · 696 阅读 · 0 评论 -
一篇文章说清楚shared_ptr,unique_ptr的区别和关系
一. shared_ptr的基本用法(一)与unique_ptr的比较 比较 shared_ptr unique_ptr 备注 初始化 ①shared_ptr<T> sp; sp.reset(new T()); ②shared_ptr<T> sp(new T()); ③shared_ptr<T> sp1 = sp;//拷贝...原创 2021-09-03 15:46:59 · 10843 阅读 · 0 评论 -
C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多。1、右值引用C++11引入了右值引用,用&&表示右值引用,如int &&a = add(1,2)。先了解下什么是左值和右值,简单的说,下面的表达式:int a = 10;等号“=”左边的a为左值,右边的10为右值;当然这只是表面的定义,进一步说,左值是有固定...转载 2021-08-27 14:59:43 · 2247 阅读 · 1 评论 -
C++ 进程间通信详解
一,C++ 常用进程间通信管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。 命名管道(namedpipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linu.转载 2021-06-22 15:11:13 · 10664 阅读 · 0 评论 -
C/C++ 服务器程序(从入门到精通)
Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的 Windows 服务。当初我写第一个 NT 服务时,我到 MSDN 上找例子。在那里我找到了一篇 Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文转载 2021-04-26 11:26:34 · 2551 阅读 · 0 评论 -
Qt和MFC的比较
在当今基于C++的图形界面开发领域,能与Qt相抗衡的只有MFC。MFC是微软公司的基础类库,自然得天独厚,比如开发深层次的Windows应用远超Qt,但Qt也有杀手锏,那就是跨平台。这两点大家一目了然,下面我们再来比较一下它们的其他特点。(1)开发速度就整体而言,MFC可能会快捷一些,因为Windows平台的开发工具大多很智能,因为立足于Windows的开发人群很广,从菜鸟到专业人士(开发人员一多,技术参考就多,周围可以咨询问题的人就多)。相比较而言,Qt基于Linux,可用的开发工具不多,而且这些工具原创 2021-04-07 20:18:48 · 12255 阅读 · 1 评论 -
C++ 11 多线程--线程管理(清晰好文,你值得拥有)
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行,区别于并发,在一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程。并发编程的方法通常,要实现并发有两种方法:多进程和多线程。多进程并发使用多进原创 2020-12-23 19:03:13 · 340 阅读 · 0 评论 -
标准模板库绕不过的坎-迭代器失效,常用的处理方法
1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。 for (iter = cont.begin(); iter != cont.end();) { (*it)->..原创 2020-10-30 20:12:57 · 276 阅读 · 0 评论 -
C++ 常用设计模式(学习笔记)
1、工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式 1)、简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。typedef enum{ T80 = 1, T99}TankType;class Tank{public: virtual void message() = 0;};class Tank80:p...转载 2018-04-28 15:02:29 · 697 阅读 · 0 评论 -
深入C++的new
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:clas转载 2017-11-14 20:39:25 · 174 阅读 · 0 评论 -
单个class的new的重载和全局new的重载
单个class的new的重载重载的 new、delete(或者 new[]、delete[])操作符必须是类的静态成员函数(为什么必须是静态成员函数,这很好理解,因为 new 操作符被调用的时候,对象还未构建)或者是全局函数,函数的原型如下:void* operator new(size_t size) throw(std::bad_alloc);// 这里的 size 为分配的内转载 2017-11-13 15:06:31 · 627 阅读 · 0 评论