c/c++
钱吉
action is powerful than speaking
展开
-
c++的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面转载 2013-06-14 17:13:34 · 698 阅读 · 0 评论 -
GetWindowRect和GetClientRect的区别详解
一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的?先说说什么叫逻辑坐标?讲到逻辑坐标,它相对的一个概念是设备坐标,是为了屏蔽掉不同设备属性差别而设置的抽象坐标系,说白了,就是独立于设备坐标的统一接口,程序员不需要去在具体的设备上进行绘原创 2014-07-18 22:40:19 · 527 阅读 · 0 评论 -
关于宏##的使用注意一点
在看《C语言高级编程》时,里面有个关于宏##的题目:1.已知#define A “menu”#define B “osd”,若请使用宏A,B表示出字符串”menuosd”答案:1 答案1:#define C A B答案2:#define _C_(a,b) a##b#define C(a,b) _C_(a,b) 然后我实际动手测试了一下,先来第一种:原创 2014-07-18 21:06:33 · 1085 阅读 · 0 评论 -
c++模板函数实例化的偏序机制
一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题:http://stackoverflow.com/questions/18283851/template-specialization-in-case-of-multiple-base-templates-in-c/18283933?noredirect=1#comment2682344原创 2014-07-18 21:06:24 · 794 阅读 · 0 评论 -
c/c++的异常统一处理
今天看HTK代码,发现里面的错误处理机制很好,所以自己在这里总结一下。如何将某些类型的错误集中起来统一处理,使得程序易于维护和具有更好的可读性。这里假设有这样一个故事,有个美女征婚,理想中的男人如果要表白成功,需要具备6个条件:玫瑰(Rose),戒指(Ring),宝马(BWM),高(Tall),富(Rich),帅(Handsome)。(好吧,我承认这个故事很低俗,但是实在想不出其它例子来比喻了原创 2014-07-18 21:05:52 · 811 阅读 · 0 评论 -
UTC时间转本地日期时间的实现
//gps日期和时间struct DATETIME{ hw_uint16 year; hw_uint8 month; hw_uint8 day; hw_uint8 hours; hw_uint8 minute; hw_uint8 seconds; hw_uint8 microsecond; DATETIME() { clear(); } hw_void clear原创 2014-07-25 15:45:07 · 953 阅读 · 0 评论 -
说说内存对齐吧
说说内存对齐为什么要内存对齐?因为CPU为了提高指令提取效率,对数据的存放地址有要求。如果不对齐,会导致效率低下,甚至错误。如何对齐?既然CPU已经作了规范,剩下的事情就交给编译器了。对于程序员,可以告诉编译器按照怎么的方式去对齐。不同的编译器指令不一样:(1) windows的编译器cl #pragma pack(n) //n表示按多少字节对齐 #pragma p原创 2014-08-20 15:51:39 · 656 阅读 · 0 评论 -
用 C 语言编写一个简单的垃圾回收器
人们似乎认为编写垃圾回收机制是很难的,是一种只有少数智者和Hans Boehm(et al)才能理解的高深魔法。我认为编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc样例难度是相当的。在开始之前有一些重要的事情需要说明一下:第一,我们所写的代码是基于Linux Kernel的,注意是Linux Kernel而不是GNU/Linux。第二,我们的代码是32bit的。第三,请不转载 2014-09-24 09:10:07 · 568 阅读 · 0 评论 -
面试小记:关于数组和指针的一个笑话
面试题目:请问运行下面的程序会出现什么结果:char* getMemory(){ char a[] = "hello,world"; return a;}int main(int argc, char **argv){ char *str = NULL; str = getMemory(); printf("%s\n", str); return 0;}我乍一原创 2015-03-19 16:56:43 · 1065 阅读 · 0 评论 -
改变控制台的输出颜色
这里面只需要用到Windows API的一个函数:SetConsoleTextAttributemsdn上的说明如下:BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput, // handle to screen buffer WORD wAttributes // text and background color原创 2014-07-18 22:50:39 · 2026 阅读 · 0 评论 -
柔性数组
(我的旁白:什么是柔性数组?其实就是0长度数组,听起来高大上,玩起来还真是高大上啊,哈哈,以前没注意这些,今天用到,特意搜索了一下,学习了。)转载的:首先,我们要知道,0长度的数组在ISO C和C++的规格说明书中是不允许的。这也就是为什么在VC++2012下编译你会得到一个警告:“warning C4200: 使用了非标准扩展 : 结构/联合中的零大小数组”。那么为什么gcc转载 2015-05-09 12:05:24 · 589 阅读 · 0 评论 -
32位操作系统和64位操作系统的数据类型大小
如题,测试如下:代码:#include using namespace std;int main(int argc, char *argv[]){ cout << "char:" << sizeof(char) << endl; cout << "pointer:" << sizeof(char *) << endl; cout << "int:" << s原创 2015-06-11 19:54:50 · 720 阅读 · 0 评论 -
boost条件变量和互斥使用例子
看看:#include #include #include const int BUF_SIZE = 10;const int ITERS = 100;boost::mutex io_mutex;class buffer{public: typedef boost::mutex::scoped_lock scoped_lock;转载 2015-08-24 20:49:10 · 688 阅读 · 0 评论 -
单例模式
一:什么叫单例模式?单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管原创 2014-07-18 22:22:04 · 564 阅读 · 0 评论 -
计算机编码字符小结(ascii,unicode,utf-8)
在一个好朋友的QQ空间看到的(QQ空间也有技术文章,让我着实惊讶),转过来。为了保密就不注明地址了,应该不会被砍吧?点了无数次鼠标才找到一篇通俗易懂的关于“字符编码”的博文,现就将其摘录下来,一为笔记,二为交流。--------------------------------------------------------------------------------------转载 2014-07-18 22:54:15 · 572 阅读 · 0 评论 -
读写锁的实现
读写锁在多线程应用中经常用到。适用于读线程多余写线程的场合。对读线程读取共享资源时不加锁,而对写线程写共享资源时进行加锁控制。先说一下读线程控制:只要此时没有写操作,就可以进行读取。一旦有写操作,则阻塞等待。对于写线程来说,如果此时有读线程正在读取资源,则等待其读取完,然后判断是否所有的读线程是否已经全部读取完成,如果是,则开始写共享资源。这样可以提高效率。但是有一个问题:如果有很原创 2014-07-18 22:27:36 · 723 阅读 · 0 评论 -
结束线程的方法
转自百度文库:http://wenku.baidu.com/view/3f4b297827284b73f2425062.html在一些应用程序中,除非用户去结束应用程序的运行,否则其中的子线程会一直处于运行状态。如果应用程序在结束时不主动通知子线程退出,有可能导致主线程结束后,子线程的系统资源得不到释放。如何通知子线程结束运行呢?这需要在程序设计阶段就考虑到,通常可以用事件、消息或全局转载 2013-08-13 18:09:03 · 1033 阅读 · 0 评论 -
c++中union的应用剖析
原文来自:http://it.114study.com/program/article392928.html 原文中有好多错误,我这里做了一些修改。前言 熟悉c的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在c++出现后,它继承了union并保留了其在c中的特转载 2013-07-30 10:35:57 · 790 阅读 · 0 评论 -
线程池(译)
这是我翻译的codeproject上面的一篇文章,题目是:线程池一 简介 我的应用中,需要将数据备份到不同的地方(CD,USB,网络共享)。如果我只用单线程来做这件事情,需要花2个小时以上。而如何改善性能对我来说是一个挑战,最终我用多线程来实现了这个问题,结果非常可观,只用了30分钟就完成了我的工作。 其实在刚开始开发时,备份耗费了一整天,后来我被迫增加频率到1个小时。现在我发现原创 2014-07-18 21:06:28 · 671 阅读 · 0 评论 -
类模板和函数模板
类的成员函数是模板函数时的特例化:class Test{public: Test() {}; ~Test() {}; template void calc(T val); /*{ cout<<val*2<<endl; }*/};templatevoid Test::calc(T val){ cout<<val*2<<endl;}template<>voi原创 2014-07-18 22:27:04 · 491 阅读 · 0 评论 -
typedef声明数组及在二维数组申请中的应用
基础知识练习,随便写写,关于指针,数组,typedef的应用. #define MAXLINE 1024typedef char Pom[MAXLINE];int main(){ char *pTest[10] = {"abcd","defg"};//指针数组初始化 char MyArray[MAXLINE] = {"hello,world!"}; char原创 2014-07-19 09:42:38 · 846 阅读 · 0 评论 -
求数组全排列算法的递归实现
代码:#include #include using namespace std;/***\brief 求全排列的递归实现*\param arr-数组指针* nLen-数组长度* nBegin-排列区间的起始序号* nEnd-排列区间的末尾序号*\return 无**/templatevoid Perm(T arr[], int nLen, int nBegin, i原创 2013-06-21 15:31:02 · 1003 阅读 · 0 评论 -
c++类型转换
一:implicit cast二:explicit castconst_caststatic_castdynamic_castreinterpret_cast const char *pArray = "helloworld"; //char *pNonConst = pArray;//cannot convert from 'const char *' to原创 2014-07-18 22:23:22 · 517 阅读 · 0 评论 -
如何利用循环代替递归以防止栈溢出(译)
摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。 目录 简介模拟函数的目的递归和模拟函数的优缺点用栈和循环代替递归的10个步骤替代过程的几个简单例子更多的例子原创 2014-07-18 21:06:26 · 6279 阅读 · 0 评论 -
尾递归和编译器优化
最近看到尾递归,所谓的尾递归wiki解释如下:尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要原创 2014-07-18 21:05:50 · 1001 阅读 · 0 评论 -
eclipse快捷键
Eclipse快捷键Ctrl+Space内容助理。提供对方法,变量,参数,javadoc等得提示,需要提示的时候可先按此快捷键。 注:避免输入法的切换设置与此设置冲突Ctrl+Shift+Space变量提示Ctrl+/添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+\Ctrl+Shift+/添加/* */注释Ctrl+Shift转载 2013-08-15 21:36:09 · 524 阅读 · 0 评论 -
c++重载new/delete
原文链接:http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=40Overriding new and deleteLast updated Jan 1, 2003.If you’re looking for more up-to-date information on thi转载 2013-06-26 10:45:44 · 754 阅读 · 0 评论 -
memmove 和 memcpy的区别
原文链接:http://blog.chinaunix.net/uid-26495963-id-3080058.htmlmemcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memm转载 2013-06-19 15:02:10 · 1054 阅读 · 0 评论 -
短小精悍的宏(整理篇)
c/c++里面常常需要定义一些宏,以提高编程效率和调试,同时使得代码结构简练。这里从网上查找了一下,并集中整理,方便以后使用。个别地方加了一点自己的注释(红色字体表示)。其实都是些小儿科的编程技巧了,请勿见笑,只是想方便像我这样的新手共同学习。一:#、##和__VA_ARGS__(转自:http://www.cnblogs.com/zhujudah/admin/EditPosts.原创 2014-07-18 22:56:12 · 574 阅读 · 0 评论 -
字符编码及文件读取的基础知识
这是以前写的一点笔记,把它转过来。1、二进制文件和文本文件首先看二段代码:生成一个二进制文件和一个文本文件。打开一个二进制文件:test.dat,写入整数1234,其对应的十六进制为04 D2。 FILE *pfile; int ntest = 1234; if(NULL == (pfile=fopen("test.dat","wb")))原创 2014-07-18 22:58:57 · 830 阅读 · 0 评论 -
如何创建一个简单的C++同步锁框架(译)
<!--H3 { margin-bottom: 0.21cm; }H3.ctl { font-family: "Lohit Hindi"; }H2 { margin-bottom: 0.21cm; }H2.ctl { font-family: "Lohit Hindi"; }P { margin-bottom: 0.21cm; }A:link { }-->翻译自codeproject原创 2014-07-18 21:06:31 · 818 阅读 · 0 评论 -
动态链接库(DLL)总结
以前的学习笔记,记录库的一点学习心得。主要是Windows下的静态库和动态链接库,动态链接库只写了关于非MFC的DLL,比较初级,适合和我一样的新手看看。有不对的地方请指出,有疏漏的地方请补充,如果您比较闲的话,呵呵,感激不尽。一:静态链接库 静态库(static library)将函数和数据编译进一个二进制文件,通常可以命名为*.lib,编译器在链接过程中,将这些二进制数据复制出来,并原创 2014-07-18 21:06:17 · 681 阅读 · 0 评论 -
c和c++中const的区别
关于常量指针,首先看这段代码:const int test = 5;const int *pm = &test;int *pn = pm;printf("%d\n",(*pn)++);printf("%d\n",*pm);printf("%d\n",test);在C语言中标准中,编译器可以通过非const指针修改const值(我用gcc 4.6.1,输出结果:5原创 2014-07-18 21:05:54 · 491 阅读 · 0 评论 -
反汇编学习
(转:http://www.kuqin.com/assemble/20071122/2492.html)汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机) ============================ x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数.原创 2014-07-18 21:05:37 · 1222 阅读 · 0 评论 -
前向声明可能引起的new崩溃
试试:a.h#pragma oncestruct RandomData;class A{public: A(); ~A(); bool Run();private: RandomData *m_pData;};a.cpp#include #include "a.h"struct RandomData{ int n;};A::A() :m_原创 2015-12-09 21:24:49 · 653 阅读 · 0 评论