C++
神牛BB
精湛技术狂
展开
-
一、音频的基础篇
一、音频的基础篇 占个坑原创 2018-11-01 11:46:10 · 406 阅读 · 1 评论 -
windows进程中的内存结构
windows进程中的内存结构在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如转载 2015-03-05 21:38:01 · 666 阅读 · 0 评论 -
“浅拷贝”与“深拷贝”
C++中对象的复制就如同“克隆”,用一个已有的对象快速地复制出多个完全相同的对象。一般而言,以下三种情况都会使用到对象的复制:(1)建立一个新对象,并用另一个同类的已有对象对新对象进行初始化,例如:[cpp] view plaincopyclass Rect { private: int width; int height; }; R转载 2015-03-05 16:57:51 · 390 阅读 · 0 评论 -
c/c++内存分配与内存对齐全面探讨
不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下。 此文章有2个用处,1:这是个小论文,格式完整,大家可以复制回去交作业;2:这是整理的经典C内存分配小教程(也加了些我自己的观点),不明白内存分配的可以看看。还有很重要的一个问题: 这篇文章引用的很多内容我也不知道究竟是出自转载 2015-03-01 18:30:57 · 446 阅读 · 0 评论 -
c++虚函数解析
前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。转载 2015-02-14 18:42:33 · 338 阅读 · 0 评论 -
C++对象内存模型
这篇文章成为了打开C++对象模型内存布局的一个引子,引发了大家对C++对象的更深层次的讨论。当然,我之前的文章还有很多方面没有涉及,从我个人感觉下来,在谈论虚函数表里,至少有以下这些内容没有涉及:1)有成员变量的情况。2)有重复继承的情况。3)有虚拟继承的情况。4)有钻石型虚拟继承的情况。 这些都是我本篇文章需要向大家说明的东西。所以,这篇文转载 2015-02-14 18:42:03 · 487 阅读 · 0 评论 -
C++对象内存模型2
重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。 其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还有自己的虚函数,自己overwrite父类的虚函数。如子类D中,f()覆盖了转载 2015-02-14 18:51:16 · 358 阅读 · 0 评论 -
C++ 常见崩溃问题分析
一、前言从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来的经验,以期通过自己的经历为他人和自己带来福祉:写出更高质量的程序; 由于 C 和 C++ 这两种语言血缘非常近,文本亦对 C 编程语言有借鉴作用; 二、C++转载 2015-02-28 18:42:12 · 1237 阅读 · 0 评论 -
C++多线程安全类的问题
我们是多么渴望各种C++类都是多线程安全的,然而一旦涉及到对象间的交互,这样的渴望可能就只能是奢望了。下面,我们以设计一个双向链结点为例,看看要使其多线程安全将会带来一些什么问题。class DoublyLinedNode{ DoublyLinedNode* pPrevNode_; DoublyLinedNode* pNextNode_; public:转载 2015-02-28 18:22:59 · 6173 阅读 · 0 评论 -
STL源码剖析---红黑树原理
一、红黑树概述 红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。这一点在我们了解了红黑树的实现原理后,就会有更加深切的体会。 红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL转载 2015-02-10 15:23:13 · 544 阅读 · 0 评论 -
函数调用方式__stdecl _stdcall _fastcall __thiscall介绍
__cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,转载 2015-03-05 18:19:36 · 695 阅读 · 0 评论 -
鹅厂C++面试
面试经验-鹅厂基础一面悲剧了,整理下:1. const 使用2. 类对象内存模型 - 虚表-函数-成员 3. 拷贝构造函数:深拷贝和浅拷贝4. 函数调用 stdcall _ xxxcall5. 堆栈原理6. 内存管理7. windebug pdb 和 dump怎么录制下来的8. 线程调度,两个线程调度做了些什么9. loadlibrary做了什么1原创 2015-03-04 10:32:44 · 963 阅读 · 0 评论 -
套接字IO模型(三) WSAEventSelect模型
WSAEventSelect模型类似WSAAsynSelect模型,但最主要的区别是网络事件发生时会被发送到一个事件对象句柄,而不是发送到一个窗口。这样可能更加的好,对于服务器端的程序来说。使用步骤如下:a、 创建事件对象来接收网络事件:WSAEVENT WSACreateEvent( void );该函数的返回值为一个事件对象句柄,它具有两种工作状态:已传信(si转载 2015-07-29 22:38:33 · 505 阅读 · 0 评论 -
VS2008设置内存断点
菜鸟的我居然不知道什么是内存断点。自己理解一下:内存断点就是当某个内存改变的时候会断下来的。就跟程序断点一样,运行到那里就断下来一样。VS2008怎么设置内存断点呢。我打开内存监视器。按F9是没有效果的,给出错误提示。后来通过网上搜了才知道原来是这样设置的哦!哈哈。截图什么的就算了,因为我觉得我对VS2008的界面应该还是比较了解的吧。哈哈1.内存断点只能是在程序调试运行的时候转载 2015-07-28 19:50:27 · 1235 阅读 · 0 评论 -
Dump文件
Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。在Windbg中可以通过.dump命令保存进程的dump文件。比如下面的命令把当前进程的镜像保存为c:\testdump.dmp文件:.dump /ma C:\tes转载 2015-07-28 22:01:27 · 587 阅读 · 0 评论 -
Windows文件操作的API函数[转载]
在VC中,大多数情况对文件的操作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件操作 API 函数介绍: 一般文件操作 API CreateFile 打开文件 要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。 ReadFile 从文件中读取字节信息。 在打开文件获得了文件句柄之后转载 2015-07-28 22:28:24 · 577 阅读 · 0 评论 -
非递归方法遍目录
之前有个电话面试,其中一道题就是:用非递归的方式实现文件夹遍历?在电面的时候没有答出来,过后分分钟就想到了答案,因为之前自己实现过按层序的方式打印一棵树,用的也是非递归的方式,现在遍历文件夹不就是遍历这颗树吗!怎么就没想出来呢!在这里简单的记录下,用了C#和C++两个版本实现。 我这里的实现的功能是:用非递归的方式获得一个文件夹中文件的个数。 思路简单介绍:原创 2015-07-28 22:43:15 · 735 阅读 · 0 评论 -
编写的windows程序,崩溃时产生crash dump文件的办法
一、引言dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草。windows程序产生dump文件和linux程序产生dump文件的方式不一样,linux默认是不让产生core dump文件,只要在用户自己的~/.bash_profile文件中增加ulimit -S转载 2015-07-28 08:37:39 · 828 阅读 · 0 评论 -
为什么需要字节对齐?
文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访转载 2015-07-27 21:27:16 · 404 阅读 · 0 评论 -
C++之“友元类”学习笔记
=======================什么是友元类======================= 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。=======================友元类能做什么======================= 友元类可以通过自己的方法转载 2015-07-27 21:36:00 · 360 阅读 · 0 评论 -
窄字节与宽字节
窄字节与宽字节 1、什么是窄字节,什么是宽字节:英文字符,其大小为1字节的,叫窄字节英文字符,其大小为2字节的,叫宽字节2、不管编译器宽窄设置,中文字符默认占2字节,英文字符默认占1字节如: sizeof(‘你’) 结果是2 ,不管编译器如何设置宽窄sizeof("你");结果3 中文2字节,结束符1字节 双引号表示字符串,自动添加结束符sizeof(转载 2015-03-06 11:31:12 · 3822 阅读 · 0 评论 -
stl hash_map详解
0 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻转载 2015-02-10 15:32:43 · 460 阅读 · 0 评论 -
Boost 1.57.0编译成VS2008版本
今天Boost.org上下载了Boost的最新版本1.57.0,然后编译成VS2008的可用版本,总耗时大概20分钟左右。步骤如下:1. 至Boost.org上下载Window下的Boost最新版 http://www.boost.org/users/download/ PS: 我下载的后缀为.7z的压缩版本。2. 解压至本地硬盘,我解压在D:/boost_1_57_0下。转载 2015-01-23 17:17:55 · 1337 阅读 · 0 评论 -
多线程同步 - 同步方法列表
转自:http://anwj336.blog.163.com/blog/static/89415209201010173049365/线程的同步Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程的各线程之间。它是:· 一个局部性对象,不是一个核心对象。· 快速而有效率。· 不能转载 2015-02-10 17:16:53 · 757 阅读 · 0 评论 -
C++ 智能指针详解
智能指针内容很多,重点是基本用法。#include class CBase: public boost::enable_shared_from_this {public:virtual void f(){}//必须有个虚函数才能向上向下转换。}typedef boost::shared_ptr CBasePtr;class CChild: public CB转载 2015-01-26 14:45:07 · 379 阅读 · 0 评论 -
VC++中接口的二进制兼容性
在设计一个SDK或一个可重用的框架时,设计者必然要考虑的一个问题就是实现如何不同版本的兼容,即如何保证基于低版本开发的应用程序不需要作任何改动(如重新编译)就可以运行的在高版本的SDK或框架下。本文提出了VC++下实现接口兼容的三种不同的方式。关键词 C++,设计,接口,框架,VC++目录1. 概述2. VC++的对象模型3.转载 2014-02-11 17:13:40 · 740 阅读 · 0 评论 -
Qt QPainter绘图原理
Qt绘图要用到QPainter类,绘图的设备通常是主部件,也可以是QLabel部件或QTextEdit部件,通过一定的算法实现可以绘制出很漂亮的图形或我们需要的图形。绘制时需要先定义一个QPainter类对象,绘制可以选择的道具可以使Qpen(画笔)、QBrush(画刷)。使用QPen写文本时还可以指定字体(QFont类)如下面一段代码:QPanter painter;Q转载 2013-11-06 14:54:00 · 611 阅读 · 0 评论 -
QT的Graphics View柜架(3/3)
关键特性缩放与旋转QGraphicsView通过QGraphicsView::setMatrix()支持同QPainter一样的仿射变换,通过对一个视图应用变换,你可以很容易地支持普通的导航特性如缩放与旋转。下面是一个例子:class View:;public QGraphicsView{Q_OBJECT//.....public slots:void zoom转载 2013-11-06 11:38:12 · 568 阅读 · 0 评论 -
图形视图体系(The Graphics View Framework)
这里的内容,只是个人学习QT的官方文档时,记录的个人理解。用中文写,是因为官方英文文档已经非常详细,我不打算翻译一个中文的版本,所以,只是挑选了一些自己感兴趣的内容,记录一些要点和自己的理解等 英语好的同学可以直接看官方文档:http://doc.qt.nokia.com/4.6/graphicsview.html 概念名称含义V转载 2013-11-06 15:06:30 · 969 阅读 · 0 评论 -
QT的Graphics View柜架(1/3)
Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放。这个柜架也包含一个事件传播结构,对于在scene中的这些items,它具有双精度的交互能力。Items能处理键盘事件,鼠标的按,移动、释放、双击事件,也可以跟踪鼠标移动。Graphics View使用BSP树来提转载 2013-11-06 11:36:04 · 688 阅读 · 0 评论 -
QT的Graphics View柜架(2/3)
Graphics View 坐标系统Graphics View基于笛卡尔坐标系。item在场景中的位置与几何形状通过x,y坐标表示。当使用未经变形的视图来观察场景时,场景中的一个单位等于屏幕上的一个像素。在Graphics View中有三个有效的坐标系统:Item坐标系,场景坐标系,视图坐标系。为了简化你的实现,Graphics View提供了方便的函数,允许三个坐标系之间相互映射。当渲染转载 2013-11-06 11:37:35 · 615 阅读 · 0 评论 -
QWidget QMainWindow QDialog 三者区别
Qt类是一个提供所需的像全局变量一样的大量不同的标识符的命名空间。通常情况下,你可以忽略这个类。QObject和一些其它类继承了它,所以在这个Qt命名空间中定义的所有标识符通常情况下都可以无限制的使用。QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己的表现。每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。转载 2013-11-15 12:32:52 · 665 阅读 · 0 评论 -
设计模式 - 简单工厂模式(C++)
一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。 1.静态工厂方法统一管理对象的创建。静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。2.静态工厂方法推迟了产品的实例化。通原创 2012-07-27 10:30:16 · 620 阅读 · 0 评论 -
线程概述,优先级,睡眠,创建及终止(VC_Win32)
目录线程概述线程内幕线程相关函数详解线程创建线程睡眠(CPU时间片分配方式)线程的优先级线程的终止线程同步(本章节中例子都是用 VS2005 编译调试的)线程概述组成内核对象 操作系统用它来对线程实施管理,内核对象也是系统用来存放线程统计信息的地方,但创建线程时,系统创建一个内核对象,该线程内核对象不是线程本身,而是操转载 2015-01-27 15:25:00 · 1230 阅读 · 0 评论 -
线程同步(VC_Win32)
Interlocked 系列函数为何要使用 Interlocked 系列来修改线程共享变量,先看看下面的例子://共享变量 g_xlong g_x = 0;//线程1DWORD WINAPI ThreadFunc1(PVOID pvParam){ g_x++; return 0;}//线程2DWORD WINAPI ThreadFunc2(PVO转载 2015-01-27 19:14:59 · 907 阅读 · 0 评论 -
STL中的map容器
一、关于map的介绍map是STL的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据转载 2015-02-09 23:01:02 · 446 阅读 · 0 评论 -
STL中map原理解析
map简介 map是STL的一个关联容器(associative container)之一,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自转载 2015-02-09 14:35:32 · 2397 阅读 · 0 评论 -
STL(简介模板库)
STL = Standard Template Library,标准模板库STL被内建在你的编译系统之内。STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。在C++标准中,STL被组织为下面的13个头文件:algorithm>、deque>、functional>、iterator>、array>、vector>、list>、、map>、、memory>转载 2015-02-09 14:26:04 · 441 阅读 · 0 评论 -
vector的成员函数解析
vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问元素,还可以使用指针的偏移方式访问,和常规数组不一样的是,vector能够自动存储元素,可以自动增长或缩小存储空间,vector的优点:1. 可以使用下标访问个别的元素2.转载 2015-02-09 13:57:05 · 346 阅读 · 0 评论 -
进程间通信
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共转载 2015-01-08 13:08:52 · 328 阅读 · 0 评论