C/C++
hkx1n
当你得意的时候,不要忘记你有一半命运掌握在上帝手中;当你失意的时候,不要忘记你有一半命运掌握在自己手中!
展开
-
case 语句注意
<br />case语句中若不加大括号则不能声明新的变量或者函数。。。<br /><br /><br />case 1:<br /><br /><br />break;<br /><br /><br /><br /><br />case 1:<br />{<br />}<br />break;原创 2011-03-26 10:19:00 · 746 阅读 · 0 评论 -
环形缓冲区,魔戒lordrings,boost的circular_buffer
<br />写服务器的代码时,为了减少内存的分配,我们很多时候需要一个池子,讲需要分配的资源先new出来,放在池子里面。这个池子的总长度(容量)应该是大部分时候是固定,<br />表面看来,这种要求用std::list实现最简单,list可以在开始和结尾的地方增加删除。但你会发现,如果使用std::list作为池子,性能会是你很头疼的一个东西,std::list分配一个加入一个对象,或者释放一个对象,可能都会对应一次new,delete操作。如果这样的操作频繁,std::list就会成为效率的瓶颈。我的一个转载 2010-08-10 22:11:00 · 585 阅读 · 0 评论 -
静态成员与类的继承
1. 基类的静态数据成员存储在静态存储区;当子类继承了基类后,内存种仍然只有这一个static变量,所以不能算作是继承;2. 子类继承了父类后不能修改基类的静态数据成员。原创 2010-08-10 14:57:00 · 762 阅读 · 2 评论 -
小总结
不可以给一个指针赋一个空指针,例如:int* p1;int* p2;p2 = p1;原创 2010-07-27 16:03:00 · 373 阅读 · 0 评论 -
C++0x, rvalue reference, move semantics, RVO, NRVO
Visual C++ 2010 (VC10) 实现了一些颇有用处的 C++0x 新特性,其中就包括(万众期待的)rvalue reference 。本文不打算详述 rvalue reference 是什么了,关于这方面的文章已经不少,读者可以自己搜索来看看。我要说的是,今天我做了一些非常简单的关于 rvalue reference 的性能测试,其中有非常鼓舞人心的部分,也有 C++ 一以贯之的转载 2010-05-26 20:06:00 · 762 阅读 · 0 评论 -
在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?线程函数:DWORD WINAPI ThreadProc( while(!bTerminate) { // 从一个链表中读取信息并且插入到CListCtrl中 // CListCtrl的句柄是通过线程参数传递进来的 for(;;) {转载 2010-04-10 16:15:00 · 545 阅读 · 0 评论 -
在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?线程函数:DWORD WINAPI ThreadProc( while(!bTerminate) { // 从一个链表中读取信息并且插入到CListCtrl中 // CListCtrl的句柄是通过线程参数传递进来的 for(;;) {转载 2010-04-10 16:09:00 · 391 阅读 · 0 评论 -
C++接口与实现分离的2种方法 (C/C++)
方法一:使用另一个实现类分装类的私有成员和函数,这种方法称为Pimpl方法。,也就是组合的方法。#include #include class CTest{public: CTest(); ~CTest() {std::cout void do_something();private: class CTestImp; boost::shared_ptr pimpl_;};class转载 2010-04-03 11:05:00 · 916 阅读 · 0 评论 -
Visual Studio 2010 C++ 0x
C++的新标准C++0x虽然还没有正式发布,但是已经进入了feature freeze的阶段,很多人都在猜测C++0x中的x到底是9还是10,从目前的情况来看,9是最大的可能了。Visual Studio 2010作为下一代开发工具,当然不会错过对新的C++标准C++0x的支持。除了随着之前发布的Visual C++ Feature Pack而引入的TR1包含的部分特性外,在新原创 2010-04-12 09:40:00 · 728 阅读 · 0 评论 -
关于可变参数宏
最近看ACE的例子,看到一个代码段:#define DEBUG_PREFIX ACE_TEXT("DEBUG%I")#define MY_DEBUG(FMT,...) ACE_DEBUG((LM_DEBUG, DEBUG_PREFIX FMT __VA_ARGS__))调用该宏:MY_DEBUG(ACE_TEXT("%IHi Mom/n"));原创 2010-04-13 16:13:00 · 538 阅读 · 0 评论 -
Boost 1_42_0在windows下的编译及其设置
1. 首先在http://sourceforge.net/projects/boost/files/boost/1.42.0/ 下载boost库的最新版本boost_1_42。注意要把boost库放在一个至少有6个g空间的硬盘编译。 2. 下载后使用命令行进入boost库的根目录(我的为:E:/boost_1_42_0)。 3. 在命令行窗口运行boost库的根目录的批处理文件原创 2010-03-24 15:04:00 · 1406 阅读 · 0 评论 -
Pygame介绍
Pygame是一套用来写游戏的Python模块。它是基于SDL库的,它使你可以用Python语言创建完全界面化的游戏和多媒体程序。Pygame可以运行在几乎所有的平台和操作系统上。 Pygame是免费的,它是在LGPL许可证下发布的,你可以用它来创建免费软件、共享软件和商业游戏。下面,我们用一个例子来了解一下用Pygame来写游戏: 1 import sys, pygame 2原创 2010-03-19 13:59:00 · 1389 阅读 · 0 评论 -
CxImage
经过多日的痛苦挣扎终于征服了CxImage类库,在此谈谈具体方式。开始时我用的是cximage600_full,但是在按照配置弄完之后总是不成功出现很多link错误:Linking... Creating library Debug/Image.lib and object Debug/Image.exp cximage.lib(ximaraw.obj) : error LNK2001原创 2010-03-15 23:58:00 · 4283 阅读 · 2 评论 -
几种出色的C/C++ GUI函数库的介绍
QThttp://www.trolltech.comhttp://www.qiliang.net/qt.htmlQt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些转载 2009-11-08 18:14:00 · 2466 阅读 · 0 评论 -
#pragma once 与 #ifndef 的区别解析
为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #原创 2009-07-01 15:20:00 · 1845 阅读 · 1 评论 -
继承的小问题
class A {public: A(int x):i(x) {} void foo() { cout }protected: int i;};class B : public A {public: B(int x, int y):A(x), i(y) {} void foo() { cout }原创 2009-06-26 11:46:00 · 552 阅读 · 0 评论 -
模板类的友元重载函数
#include using namespace std;templateclass Test {public: friend ostream& operator (ostream& out, const Test& obj); Test(T n=0):num(n){} Test(const Test& copy) { num = c原创 2009-06-24 15:00:00 · 867 阅读 · 0 评论 -
vector中resize和reserve接口的异同
<br /> <br /> 初次接触这两个接口也许会混淆,其实接口的命名就是对功能的绝佳描述,resize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。<br /> 为实现resize的语义,resize接口做了两个保证:<br /> 一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。<br /> 二是保证区间[0, new_si转载 2010-08-26 10:55:00 · 520 阅读 · 0 评论 -
sprintf与snprintf
<br />int sprintf( char *buffer, const char *format [, argument] ... );<br />除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。printf和sprintf都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明原创 2010-12-03 13:11:00 · 3080 阅读 · 0 评论 -
[c、c++]宏中"#"和"##"的用法(zz)
<br />[c、c++]宏中"#"和"##"的用法(zz)宏中"#"和"##"的用法<br />一、一般用法<br />我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.<br />用法:<br />#include<cstdio><br />#include<climits><br />using namespace std; <br />#define STR(s) #s<br />#define CONS(a,b) int(a##e##b)in转载 2011-03-08 10:17:00 · 514 阅读 · 0 评论 -
fstream.getline的坑
<br />wfstream f(data_file, wfstream::in);<br /><br /> while( !f.eof() && f.good() )<br /> {<br /> TCHAR sz[1024 * 128 ] = {0};<br /> f.getline(sz, (sizeof(sz) / sizeof(wchar_t)) - 1);<br /> }<br />两个说明,一是fstream.getline的第二个参数需要传入字符数转载 2011-01-29 21:05:00 · 1622 阅读 · 1 评论 -
一些STL,string的算法
<br />toupper, tolower<br />地球人都知道 C++ 的 string 没有 toupper ,好在这不是个大问题,因为我们有 STL 算法:<br /><br />string s("heLLo");<br />transform(s.begin(), s.end(), s.begin(), toupper);<br />cout << s << endl;<br />transform(s.begin(), s.end(), s.begin(), tolower);<br />c转载 2011-01-29 19:52:00 · 613 阅读 · 0 评论 -
几个STL算法:includes,set_difference、set_intersection、set_symmetric_difference、set_union, pre_permutation, next_permutation
includes:测试有序序列中是否包含另一个序列的全部元素。templatebool includes(inputIterator1 first1, inputIterator1 last1, inputIterator2 first2, inputIterator2 last2);templatebool includes(inputIterator1 first1, inputIterator1 last1, inputI原创 2011-01-28 22:15:00 · 3100 阅读 · 0 评论 -
seekg()与tellg()相关文件操作
<br />对输入流操作:seekg()与tellg()<br />对输出流操作:seekp()与tellp()<br />下面以输入流函数为例介绍用法:<br />seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。<br />对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:<br />ios::beg:表示输入流的开始位置<br />ios::cur:表示输入流的当前位置<br />ios::end:表示输入流的结束位置<br /原创 2011-01-28 20:24:00 · 1053 阅读 · 0 评论 -
自己写的一个智能指针类
<br />#pragma once<br />template <typename T><br />class PtrData<br />{<br /> friend class CSmartPtr<T>;<br />public:<br /> explicit PtrData( const T* pT):p_(pT) { count_ = 1; }<br /> ~PtrData() { delete p_; count_ = 0; }<br /> void operator ++ () { ++coun原创 2011-01-27 23:02:00 · 584 阅读 · 0 评论 -
在C++中创建持久对象
持久对象(persistent objects)广泛应用于游戏、分布式数据库系统、多媒体以及图形应用程序中。目前C++并不直接支持持久性(persistence)(但有一些在C++未来版本中添加持久性和反射(reflection)的建议)。持久对象可以在创建它的程序的作用域之外保持自身状态。把对象写入一个文件并在以后重建之,或者把对象传送到一台远程机器,就是这样的例子。对持久性的支持并不象第一眼看上去那样简单,同一对象的大小和内存布局在不同的平台上可能并不相同,而不同的字节次序(byte ordering原创 2011-01-21 00:25:00 · 554 阅读 · 0 评论 -
istream_iterator, ostream_iterator,copy以及文件序列化
<br />#include <iostream><br />#include <fstream><br />#include <algorithm><br />#include <cassert><br />#include <numeric><br />#include <string><br />using namespace std;<br />int main()<br />{<br /> vector<int> vec_int;<br /> for (int i=0; i<10; i++)<br原创 2011-01-17 23:54:00 · 918 阅读 · 0 评论 -
面对查找需求如何选择容器
<br />在写代码的时候,即使编程老手经常会遇到一个不知道如何抉择的事情,面对查询的需求如何选择容器,容器的大小等因素也会困扰我们的选择。为什么呢?新手面对查询往往会直接选择map,因为map是内部是支持查询函数的,但老手知道map是通过复杂性换取查询的性能的(map的实现往往是红黑树),那如果要保存的数据个数不多呢,是否值得使用map这样的容器呢?<br />最近两天写了几行短小的代码,针对这个问题进行了一测试,测试对vector,map,hash_map三种有代表性的容器进行了测试,测试容器的长度为1转载 2010-11-22 21:54:00 · 461 阅读 · 0 评论 -
条款24:当关乎效率时应该在map::operator[]和map-insert之间仔细选择
<br />让我们假设有一个支持默认构造函数以及从一个double构造和赋值的Widget类:class Widget {<br />public:<br /> Widget();<br /> Widget(double weight);<br /> Widget& operator=(double weight);<br /> ...<br />}<br />现在让我们假设我们想建立一个从int到Widget的map,而且我们想有初始化有特定值的映射。这可以简化为:map<int,转载 2010-11-23 10:54:00 · 947 阅读 · 0 评论 -
[转载]关于C++,我觉得好的设计法则
<br />以前是一个人闷头写代码。工作久了,发现同行们的代码基本都不能看,当然不少还来自大公司。因此大公司的代码也基本不能看。在学校里就听说过许多同学的憧憬,要进什么大公司学技术,现在看来真是好笑,能学到才怪呢。<br />游戏行业我还蛮清楚,暴雪不知道,反正一直很崇拜,代码应该牛逼,看招聘就能看出来,不懂游戏的别来这里玩。牛逼。<br />其他公司,包括所有的日本公司+中国公司代码都不堪入目。<br />1.首先我觉得写代码之前要了解自己,所为有所为,有所不为,并不是所有优雅的东西都是每个人原创 2011-01-08 21:58:00 · 603 阅读 · 0 评论 -
C+文件读写mode参数
<br />ios::in和ios::out分别表示读打开和写打开 <br /> ios::app表示在文件末尾追加 <br />ios::ate:打开文件之后令读写位置移至文件尾端(at end)<br />ios::ate是打开文件时定位到文件末尾<br /> ios::trunc:将先前的文件内容移除(Remove)原创 2011-01-04 09:56:00 · 720 阅读 · 0 评论 -
C++隐式转换和函数对象
<br />class Widget<br />{<br />public:<br /> Widget():a_(0) {}<br /> Widget(int a):a_(a) {}<br /> operator int& ()<br /> {<br /> return a_;<br /> }<br />private:<br /> int a_;<br />};<br /><br /><br /><br />in原创 2010-11-08 11:37:00 · 1708 阅读 · 0 评论 -
Singleton模式的double check实现方式
<br />T* pInstance = 0;<br /><br />T* getInstance()<br />{<br /> if (pInstance == NULL)<br /> {<br /> lock();<br /> if (pInstance == NULL)<br /> pInstance = new T;<br /> unlock();<br /> }<br />原创 2010-10-28 22:03:00 · 548 阅读 · 0 评论 -
多重继承和虚继承的内存布局
<br />这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。原文见这里(By Edsko de Vries, January 2006)<br /> 敬告: 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识。<br /> 本文我们将阐释GCC编译器针对多重继承和虚拟继承下的对象内存布局。尽管在理想的使用环境中,一个C++程序员并转载 2010-10-21 09:23:00 · 929 阅读 · 2 评论 -
内存泄漏【转】
<br />浅谈内存泄漏(一)<br />对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思转载 2010-10-15 09:24:00 · 461 阅读 · 0 评论 -
c++中内联汇编(收藏)
<br />一、 优点<br /> 使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤。在 Visual C++ 中,内联汇编是内置的编译器,因此不需要配置诸如 MASM 一类的独立汇编工具。这里,我们就以 Visual Studio .NET 2003 为背景,介绍在 Visual C++ 中使用内联汇的相关知识(如果是早期的版本,可能会有些许出入)。<br /> 内联汇编代码可以使用 C/C++ 变量和函数,因此它能非常容易地整原创 2010-10-12 20:14:00 · 532 阅读 · 0 评论 -
Reading Notes ofC Traps and Pitfalls
第一章1. = 不等于 ==2. & | 不同于 && ||3. 词法分析中的贪心法a---b与a-- - b的含义一样c语言词法分析规则:每个符号应该包含尽可能多的字符,也即:从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,如果不能则停止,将已经读入的可以构成运算符的几个字符作为一个运算符。a+++++b的意义是a++ ++ +原创 2009-06-19 09:23:00 · 405 阅读 · 0 评论 -
关于strcpy函数
先看一个例子:char* GetMemory(int num){ return new char[num]; }int main(){ char* str = GetMemory(10); char tmp[10]; /* 虽然str和tmp的空间大小都为10,但是: The strcpy function copies str原创 2009-06-19 09:12:00 · 907 阅读 · 0 评论 -
CString类的用法介绍和自己动手写的CString类
CString is based on the TCHAR data type. If the symbol _UNICODE is defined for your program, TCHAR is defined as type wchar_t, a 16-bit character type; otherwise, it is defined as char, the norm原创 2009-03-13 15:12:00 · 943 阅读 · 0 评论 -
回调函数
#include using namespace std;// 定义了一种函数指针类型callBacktypedef int (*callBack)(int, int); int myTest(int a, int b){ cout return 0;}void TestCallBack(callBack my){ int a = 1; int b = 1; if(m原创 2009-03-08 16:09:00 · 361 阅读 · 0 评论