c++
文章平均质量分 56
suhuaiqiang_janlay
这个作者很懒,什么都没留下…
展开
-
编译与链接详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/Gamebot/article/details/78301714前文:我们知道一个.c/.cpp源程序文件要最后变成我们的.exe(windows)或者.out(Linux)可执行文件,要经过我们的编译和链接。了解这个过程对程序员来说...转载 2019-10-17 16:57:15 · 2014 阅读 · 0 评论 -
内存池——第三章 关于TcMalloc(2)
周末抽空看了一下tcmalloc,了解了个大概。下面记录一下。一. 原理tcmalloc就是一个内存分配器,管理堆内存,主要影响malloc和free,用于降低频繁分配、释放内存造成的性能损耗,并且有效地控制内存碎片。glibc中的内存分配器是ptmalloc2,tcmalloc号称要比它快。一次malloc和free操作,ptmalloc需要300ns,而tcmalloc只要50ns翻译 2016-04-20 00:38:45 · 1752 阅读 · 0 评论 -
C++ 对象的内存布局(下)
<br /><br />C++ 对象的内存布局(下)<br /> <br />陈皓<br />http://blog.csdn.net/haoel<br /> <br /> <br /><<<点击这里查看上篇<br /> 重复继承<br /> <br />下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。<br /> <br />下图是一个继承图,我们重载了父类的f()函数。<br /> <br /><br /><br /> <br />其类继承的源代码如下所示。其中转载 2010-12-21 17:24:00 · 430 阅读 · 0 评论 -
C++ 对象的内存布局(上)
<br /><br />C++ 对象的内存布局(上)<br /> <br />陈皓<br />http://blog.csdn.net/haoel<br /> <br /> 点击这里查看下篇>>>前言<br /> <br />07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的转载 2010-12-21 17:22:00 · 563 阅读 · 1 评论 -
C++ 虚函数表解析
<br /><br />C++ 虚函数表解析<br /> <br />陈皓<br />http://blog.csdn.net/haoel<br /> <br /> 前言<br /> <br />C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做转载 2010-12-18 10:06:00 · 618 阅读 · 0 评论 -
MFC绘图时窗口闪烁问题的办法
在网上看了不少解决办法,主要都是关于运用双缓冲的,就自己稍微总结了下双缓冲。 1、显示的图形为什么会闪烁? 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的转载 2015-09-10 12:17:22 · 980 阅读 · 0 评论 -
一则简单的Windows共享内存IPC代码
Windows共享内存可以让两个进程对同一块内存进行读写。以下有2个进程,a.cpp生成A进程,b.cpp生成b进程。那么a进程将不停地读名为"Global\\MyFileMappingObject"的共享内存块,而b进程不停地写名为"Global\\MyFileMappingObject"的共享内存块。从而实现IPC。//a.cpp#include #include #inc转载 2015-08-12 20:04:20 · 492 阅读 · 1 评论 -
STL中vector、list、deque和map的区别
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要转载 2014-06-16 17:21:22 · 589 阅读 · 0 评论 -
inline函数
函数用inline声明,称为内联函数。它与一般函数的区别在于,函数编译的时候,在调用函数的地方,用函数内部代码直接替代函数名。也就是直接将函数内代码复制到调用处,进行编译实现,而不是像一般函数那样,通过进出栈来实现函数调用。 inline函数的优缺点:原创 2010-10-15 10:19:00 · 679 阅读 · 0 评论 -
zlib 的使用
1. 下载zlib,附件是zlib 1.2.3 .2. 解压代码,打开 ./projects/visualc6/zlib.dsw .3. Build : zlib Lib Debug / zlib Lib Release ,生成的zlib.lib/zlibd.lib .4. 在我们的工程中包含头文件 zlib.h / zconf.h ,和连接生成的Lib .5. 测试代码Write to file :char * pchData = "xxx..." ; gzFile fData = g转载 2011-01-08 11:07:00 · 636 阅读 · 0 评论 -
预编译头"stdafx.h"
<br /><br /> 所谓的预编译头,就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的,不是.obj),这个文件就称为预编译头。文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。<br />转载 2010-11-11 14:07:00 · 1774 阅读 · 1 评论 -
0xcc
堆栈中的局部变量(包括指针)在明确初始化之前都用0x0cc进行初始化。这是编译器在作运行时检测用的,方便发现变量没有初始化、内存溢出的问题。 0xcc执行检测的原理: (1)变量:如果没有给它初始化,那么值就是0xcc。 (2)指针:或者说内存,初始时赋给地址0xcc。这是一块内核的内存,一般情况下不能被操作的,因此,当发现对地址为0xcc的内存进行操作,就说明是非法的,提示溢出。 0xcc输出成字符就是“烫烫...”,这就是为什么未初始化的内存总显示“原创 2010-11-09 14:00:00 · 3001 阅读 · 0 评论 -
通过C++代码验证进程中的内存布局
前阵子看《C++应用程序性能优化》,其中提到进程中的内存布局(以前只是知道内存中有这几个不同的区域,但并没有深入了解它们的分布位置)。为了加深理解,决定还是写个代码验证一下。《C++应用程序性能优化》中谈到的内存布局大致如下(以LINUX系统为例)原创 2017-06-05 17:25:33 · 668 阅读 · 0 评论 -
C++应用程序性能优化——操作系统内存管理
1. 工作集:概念:操作系统中驻留在物理内存中的内存页成为进程的工作集。工作集的大小:操作系统为每个进程定义了最小工作集(20-50MB),和最大工作集(45-345MB)(具体与系统的物理内存大小有关)工作集的增长:当执行到未被调入内存的代码页或数据页时,这些页会被调入内存,工作集随之增长。当工作集达到最大工作集,进程需要再次调入新页到物理内存原创 2016-07-17 17:09:10 · 1867 阅读 · 0 评论 -
extern "c"
<br />由于使用c和c++编译函数时,其对函数的标记名称不同。<br />为了使c编译的函数能在c++中正常调用,必须添加 extern "c"的说明,表示它是用c编译的。<br />一般使用方法:<br />确定在函数属于哪个c函数库。添加头文件的方法如下:<br />#ifdef _cplusplus<br />extern "C"<br />{<br />#endif<br />#include <...h> (所在的头文件)<br />#ifdef _cplusplus<br />}<br /原创 2010-11-15 17:49:00 · 555 阅读 · 0 评论 -
GBK及UTF-8编码的区别
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际转载 2017-02-13 18:54:46 · 1751 阅读 · 0 评论 -
C++应用程序性能优化——程序的启动过程
1. 重定位:目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码。当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整。同时,连接器需要对已经解析的符号分配运行时地址。这个过程就是重定位。原创 2016-07-17 20:08:33 · 1324 阅读 · 0 评论 -
C++应用程序性能优化——C++语言特性
最近看了本书,叫《C++应用程序性能优化》,真的有种相见恨晚的感觉。c++的书很多,但对一些核心知识的讲解通常都比较浅,或者比较含糊。本人从事c++相关开发工作也算多年了,看到这本书真的也收益良多,因此对一些核心知识点做一下整理备忘。第一部分,先整理内存分配相关的知识。原创 2016-07-17 14:02:31 · 850 阅读 · 0 评论 -
内存池——第二章 自定义内存池 & 动态分段连续的内存池(1)
本文翻译版本出自http://blog.csdn.net/060/archive/2006/10/08/1326025.aspx原文作者: DanDanger2000. 原文链接: http://www.codeproject.com/cpp/MemoryPool.aspC++ 内存池l 下载示例工程 – 105Kbl 下载源代码 – 1翻译 2016-04-19 23:17:27 · 3093 阅读 · 0 评论 -
内存池——第二章 自定义内存池 & 类似STL内存管理器原理的内存池(2)
利用C/C++开发大型应用程序中,内存的管理与分配是一个需要认真考虑的部分。本文描述了内存池设计原理并给出内存池的实现代码,代码支持Windows和Linux,多线程安全。内存池设计过程中需要考虑好内存的分配与释放问题,其实也就是空间和时间的矛盾。有的内存池设计得很巧妙,内存分配与需求相当,但是会浪费过多的时间去查找分配与释放,这就得不偿失;实际使用中,我们更多的是翻译 2016-04-19 23:23:51 · 1070 阅读 · 0 评论 -
内存池——第一章 几种常用的内存池技术
几乎所有应用程序中都会有内存的分配和释放,而频繁的分配和释放内存无疑会产生内存碎片,降低系统性能,尤其对性能要求较高的程序比较明显。下面介绍几种常见的内存池技术。 一 环形缓存 环形缓存的基本原理如图: 初始化状态(wpos_ = rpos_): 写了部分数据,同时读了一部分数据(wpos_ > rpos_):翻译 2016-04-19 23:03:41 · 9098 阅读 · 1 评论 -
内存池——第三章 一些成型的内存池基础库(1)
(1) SGI STL 中的内存分配器( allocator ) SGI STL 的 allocator 应该是目前设计最优秀的 C++ 内存分配器之一了,它的运作原理候捷老师在《 STL 源码剖析》里讲解得非常清楚。基本思路是设计一个 free_list[16] 数组,负责管理从 8 bytes 到 128 bytes 不同大小的内存块( chunk ),每一个内存块都由连续的固定大翻译 2016-04-20 00:29:39 · 1053 阅读 · 0 评论 -
关于重载拷贝构造函数和赋值运算符
在C++中,下面三种对象需要调用拷贝构造函数: 1) 一个对象以值传递的方式传入函数体; 2) 一个对象以值传递的方式从函数返回; 3) 一个对象需要通过另外一个对象进行初始化; 如果在前两种情况不使用拷贝构造函数的时候,就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值操作符共同实现的。 例如: int b = 6; int a = b; //原创 2010-11-10 17:42:00 · 2183 阅读 · 1 评论 -
关于void main(int argc, char *argv[ ])
main()函数常用的格式:main(int argc,char**argv)其中,argv为指针的指针,argc为整数。( char**argv or: char*argv[ ] or: char argv[ ][ ])下面给出一个例子来理解这两个参数的用法: 假设程序的名称为prog:1.当只输入prog,则由操作系统传来的参数为: argc=1,表示只有一程序名称。 argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog 2.当输入prog para_1,有一个参数,则由操作系统传转载 2010-11-09 14:49:00 · 4895 阅读 · 5 评论 -
可笑的unsigned double
最近犯了一个错误:定义变量类型的时候竟然定义了unsigned double的类型。由于编译能够通过,因此一直没有发现这样写会有什么样的问题。今天一次偶然的测试中发现这些变量的值都是整数。一开始觉得奇怪,明明是浮点数,怎么变成整型了?后来上网查了一下资料:原来浮点数是不能用 unsigned来规范的。unsigned 的意思就是把内存中的数据第一位也用来表示数据,而不用于表示符号位。而浮点数规定内存中数据的第一位必须是符号位。因此两者之间是互相矛盾的,这也就是为什么浮点数不会有unsigned类型。可是这样原创 2010-12-15 16:44:00 · 13764 阅读 · 6 评论 -
VC++动态链接库(DLL)编程深入浅出(四)
这是《VC++动态链接库(DLL)编程深入浅出》的第四部分,阅读本文前,请先阅读前三部分:(一)、(二)、(三)。 MFC扩展DLL的内涵为MFC的扩展,用户使用MFC扩展DLL就像使用MFC本身的DLL一样。除了可以在MFC扩展DLL的内部使用MFC以外,MFC扩展DLL与应用程序的接口部分也可以是MFC。我们一般使用MFC扩展DLL来包含一些MFC的增强功能,譬如扩展MFC的CStatic、CButton等类使之具备更强大的能力。 使用Visual C++向导生产MFC扩展DLL时,MFC向导会自动转载 2010-12-15 14:10:00 · 392 阅读 · 0 评论 -
VC++动态链接库(DLL)编程深入浅出(三)(上)
第4节我们对非MFC DLL进行了介绍,这一节将详细地讲述MFC规则DLL的创建与使用技巧。 另外,自从本文开始连载后,收到了一些读者的e-mail。有的读者提出了一些问题,笔者将在本文的最后一次连载中选取其中的典型问题进行解答。由于时间的关系,对于读者朋友的来信,笔者暂时不能一一回复,还望海涵!由于笔者的水平有限,文中难免有错误和纰漏,也热诚欢迎读者朋友不吝指正! 5. MFC规则DLL 5.1 概述 MFC规则DLL的概念体现在两方面: (1) 它是MFC的 “是MFC的”意味着可以在这转载 2010-12-15 14:05:00 · 532 阅读 · 0 评论 -
VC++动态链接库(DLL)编程深入浅出(二)(上)
上节给大家介绍了静态链接库与库的调试与查看(动态链接库(DLL)编程深入浅出(一)),本节主要介绍非MFC DLL。 4.非MFC DLL 4.1一个简单的DLL 第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数。 如图6,在VC++中new一个Win32 Dynamic-Link Library工程dllTest(单击此处下载本工程附件)。注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(d转载 2010-12-15 13:59:00 · 409 阅读 · 0 评论 -
【C/C++语言入门篇】-- 文件操作
最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起。之前本打算这个模块就结束了,文件操作就不写了,但是文件操作又是一个很重要的东西,而且也刚好能够总结之前我们学习的所有知识。同时也为了将文件操作这个初学者认为很神秘的东西给本质化。因此,本篇将逐一介绍C语言的文件操作。(本模块的命名本来是想C/C++一块儿讲解的,但是由于工作、毕业论文、业余时间的充电、还有要完成那个未知的梦等,因此因为时间问题C++就只能放在以后有机会再写了,因此本篇将是本模块的最后一篇,之后将不会再连载了,请大家谅解。)好了,回到正转载 2010-10-20 16:51:00 · 1392 阅读 · 1 评论 -
assert与verify区别
assert只在Debug环境下起作用,而在Release下相当于废话,不诊断也不执行所带的语句。如:bool DoSomething(){ bool bReturnValue = true; ...... return bReturnValue; }void Function(){ assert(DoSomething()); ......}在Release版本下assert不诊断,DoSomething()语句也不执行。 可是有时候这样会带来问题,因为我们也许需要在Release环境原创 2010-10-16 15:01:00 · 1008 阅读 · 0 评论 -
static类型
static是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static修饰符的产生原因、作用谈起,全面分析static修饰符的实质。 static的两大作用: 一、控制存储方式:static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如原创 2010-10-15 11:24:00 · 2727 阅读 · 0 评论 -
volatile变量
volatile变量的意思是易变的,它的主要作用是避免编译器优化,编译器优化是什么意思? 举个例子,为了避免过多的访问内存,编译器会为变量作一个cache,里面会存放上变量的copy, 这样就会提高程序执行效率,而变量如果加了volatile, 那么编译器就不会做这样的优化,每次用到该变量时,都会去内存取一次,从而保证取到的是变量的最新的值。通常下面情况下要用到该变量。 volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。原创 2010-10-15 10:36:00 · 6177 阅读 · 2 评论 -
C++常类型(const)
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。 一般常量和对象常量 1. 一般常量 一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。如: int const x=2; 或 const int x=2; 定义或说明一个常数组可采用如下格式: const []… 或者 const []… 例如: int const a[5]={1, 2, 3转载 2010-12-15 11:49:00 · 590 阅读 · 0 评论 -
VC++动态链接库(DLL)编程深入浅出(二)(下)
4.6 DLL导出变量 DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进程的全局数据,我们来看看在应用工程中引用DLL中变量的例子(单击此处下载本工程附件)。/* 文件名:lib.h */#ifndef LIB_H#define LIB_Hextern int dllGlobalVar;#endif/* 文件名:lib.cpp */#include "lib.h"#include int dllGlobalVar;BOOL APIENTRY DllMain(HANDLE hM转载 2010-12-15 14:00:00 · 539 阅读 · 0 评论 -
动态链接库dll 静态链接库lib 动态导入库lib
<br /><br />目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。<br />静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。<br />动态库一般会有对应的导入库,方便程序静态载入动态链接库,转载 2010-12-20 11:40:00 · 765 阅读 · 0 评论 -
VC实现程序重新启动
<br />VC实现程序重新启动<br />在很多情况下,我们需要将当前运行的程序重新运行;此时我们就必须在程序关闭后立即重新运行程序,形成新的进程;<br />实例代码:<br />1、重启按钮事件中添加代码:<br /><br /><br /> g_bIsRunAgain=true;//控制是否重新运行的变量<br /> this->SendMessage(WM_CLOSE);<br /> <br /> 在MESSAGE_MAP中药添加 ON_WM_CLOSE<br /><br />2、转载 2010-12-16 22:31:00 · 1468 阅读 · 0 评论 -
LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
<br />以前经常遇到这个警告信息,因为运行并没有什么问题,所以也没深究。但是耿耿于怀那个“ 0 个错误,0 个警告”的成功提示,在网上搜了一下。原来问题出在默认库的引用选择上。<br />VS2008,项目——属性——配置属性——C/C++——代码生成:他有/MT,/MTd,/Md,/MDd四个选项,你必须让所有使用的库都使用相同的配置,否则就会有相应的提示,甚至可能会出现无法解析的函数。有时我们使用的库不是自己可以控制的,那么就只能把工程属性设置成河你使用的库相同的选项。<br />错误 1 erro转载 2010-12-16 22:29:00 · 645 阅读 · 0 评论 -
链接器都干了些什么?
目前项目在不停的增长,我想还是在它规模仍旧很小的时候把它的模块分清楚,不同模块分到不同的 projects 里面,这里面出现了很多问题,也反映了我知识上的很多不足。 1 , project 最后的输出要设置清楚,有的是 static lib ,有的是 dll ,有的是 exe ,不一样的输出要设置好,它们都是 linker 的成果,但是以不同的方式应用。 2 , project dependency 设置好, build order 什么的,通过这些把一系列的 project 联系起来。转载 2010-12-16 15:02:00 · 540 阅读 · 0 评论 -
剖析ifstream打开含中文路径名文件失败的原因
最近写程序的时候遇到了使用ifstream打开含中文路径文件时失败的问题,在网上翻了一下,发现这是一个普遍遇到的问题,在很多人的博文中也都给出了一些解决技巧,但大多是转载的东西,很少对这个问题引发的原因有一个清晰、全面的解释。因此,我觉得有必要对该问题引发的原因作一个详细的剖析,希望对遇到同样问题的朋友们能有所帮助。首先,用一个简单的例子来重现一下我所遇到的问题:(1)在VS2008的“Property Pages”属性页中,选择“Configuration Properties”-->“General”原创 2010-10-25 13:17:00 · 27075 阅读 · 5 评论 -
VC++动态链接库(DLL)编程深入浅出(三)(下)
我们照样可以在EXE程序中隐式调用MFC规则DLL,只需要将DLL工程生成的.lib文件和.dll文件拷入当前工程所在的目录,并在RegularDllCallDlg.cpp文件(图12所示对话框类的实现文件)的顶部添加:#pragma comment(lib,"RegularDll.lib")void ShowDlg(void); 并将void CRegularDllCallDlg::OnCalldllButton() 改为:void CRegularDllCallDlg::OnCal转载 2010-12-15 14:09:00 · 520 阅读 · 0 评论