
C++
文章平均质量分 65
光宇广贞
有志于学,虽草庐中应可知天下事!
展开
-
尾递归、CPS等几种求阶乘的算法
好久没写手快生了。好久没来也已是物是人非了。发个阶乘的尾递归、CPS等几种写法吧。#include "stdafx.h"// 阶乘#include #include using namespace std;int _tmain(int argc, _TCHAR* argv[]){ function Fact = [&Fact](int n) -> int { if原创 2013-10-20 15:10:01 · 3928 阅读 · 0 评论 -
C++ 0x(C++ 09)新标准全部革新提案文档列表
<!-- /* <! [CDATA[*/ address {text-align: right} tr.basic { background:white} tr.alternate { background: #ffffcc} tr.critical { background: #ccffcc}翻译 2009-08-29 16:39:00 · 5239 阅读 · 2 评论 -
C++ 0x 即将夭折的新关键字 constexpr 为 VS 2010 拒绝
文 / 李博 (光宇广贞)const 关键字的缺陷及 constexpr 关键字的产生 话说现行标准 C++ 98/03 对于常表达式(Constant Expression)的界定过于严格。C++ 09 新标准由 Bjarne Stroustrup 等人提案(N2116)“普通化常表达式(Generalized Constant Expression)”和 constex原创 2009-08-25 22:21:00 · 14773 阅读 · 2 评论 -
看 VS 2010 对 C++ 0x 支持之 extern template
文 / 李博(光宇广贞) 《上篇文章》聊到了 VS 2010 对 C++0x 的支持在运行期强化上的不佳表现,首先是 IDE 支持得不够理想,内核上对于悬而未决的 constexpr 则直接否决,不像对 export 至少还给点儿面子。本篇聊建构期强化。主题是“外部模板”。特化模板函数实例化时遇到的问题 我在《C++ 中 export 关键字的尴尬处境》这篇原创 2009-08-23 19:46:00 · 6956 阅读 · 4 评论 -
判断一个整型值有无符号
http://topic.youkuaiyun.com/u/20090618/18/b892dbeb-2e2a-43cf-91bd-94ce661ad104.html几种有意思的方法:第一种:#define ISUNSIGNED(a) (a >= 0) && ( ~a >= 0) 第二种:a 为待测数 int b = -1;if ( a < 0 ){ c原创 2009-06-18 19:08:00 · 1623 阅读 · 1 评论 -
测试 VS 2010 对 C++ 0x 标准的谨慎支持
文 / 李博(光宇广贞) 测试版本信息如上。先简述一下背景。话说 C++ 0x 目前仍在“计划”中,新标准将取代 C++ 98/03,并已于目前开始了提案投票,争取今年末获得通过,并于明年公开,因此 C++ 0x 将被定为 C++ 09。 新标准将会更新现有 C++ 的很多方面,其中一项便是“内核语言的扩充”,这也是 C++ 标准委员会关注的主要焦点。该领域的大原创 2009-08-21 21:28:00 · 7561 阅读 · 2 评论 -
C++ 中的“有返回值”的“虚”构造函数
C++ 如何会有“虚构造函数”?而且还有返回值?有时我们希望类构造函数能够像其它普通成员函数一样使用:带返回值,可覆盖(override)。我们可以设计这样一个 constructor 函数: 我们在 LB 类中定义了这样一个“带返回值的虚构造函数”。在派生类中,我们可以覆盖(override)它。现在我们可以让这个“构造函数”像一个普通的成员函数一样使用了(其原创 2009-08-22 22:16:00 · 2764 阅读 · 3 评论 -
Linux 下的 fork()
for( i = 0; i < 5; i++ ) if( fork() == 0 ) continue; 共生成多少个子进程?简查了一下 fork() 的知识,它调用一次,返回两次,进入子进程并返回一次,然后退到父进程再返回一次,子进程中返回值为 0,父进程中返回的是子进程的进程号。答案是 31。如上图所示,这就是一个二项树,二原创 2009-06-17 15:38:00 · 3918 阅读 · 4 评论 -
C++ 中 export 关键字的尴尬处境
分离编译模式(Separate Compilation Model)允许在一处翻译单元(Translation Unit)中定义(define)函数、类型、类对象等,在另一处翻译单元引用它们。编译器(Compiler)处理完所有翻译单元后,链接器(Linker)接下来处理所有指向 extern 符号的引用,从而生成单一可执行文件。该模式使得 C++ 代码编写得称心而优雅。原创 2009-08-23 12:34:00 · 8851 阅读 · 4 评论 -
续:为何说 C++ 构造函数初始化列表异常机制是必要的
在《C++ 类构造函数初始化列表的异常机制 function-try block》这篇文章中,我聊到了这一机制带来的一大好处是提供了一套保证类对像构造过程的安全性的机制。在更前篇《C++ 构造函数初始化列表的好处》中则谈到了这一机制带来的性能上的益处。不过由于我的示例模型建得过于简单,可能让一部分读者对此理解不深,以至于引发了像 yshuise 同学情绪激动的疑惑……这篇我举一两个小原创 2009-08-18 19:21:00 · 4029 阅读 · 6 评论 -
C++ 0x 之 decltype 和 auto 受 VS 2010 支持
文 / 李博(光宇广贞) 本篇实验平台信息请见《这篇文章》。 在《C++ 0x 新标准全部革新提案文档列表》中,N1478 N1527 N1607 N1705 N1978 N2115 N2343 等文件提案向新标准语言内核中添加 decltype 算符和 auto 关键字(旧体新义)。该提案由 BS 参与设计。decltype 算符用于查询表达式类型;auto原创 2009-09-03 15:44:00 · 8234 阅读 · 10 评论 -
C++ 0x 之 Lambda:贤妻与娇娃,你娶谁当老婆?听 FP 如何点化 C++
文 / 李博(光宇广贞) 先以《N1958》提案的开场白,做为本文的开场白吧:A number of languages provide a way of passing code as arguments without having to define a separate named function. For example, Algol 68 has downwa原创 2009-09-08 19:39:00 · 4891 阅读 · 3 评论 -
咖喱函数(Curry Func)
文 / 李博(光宇广贞)Wikipedia, the Imperialistic encyclopedia In mathematics and computer science, curring, invented by Moses Schönfinkel and later re-invented by Haskell Curry, is the technique o原创 2009-09-20 22:13:00 · 3639 阅读 · 2 评论 -
FP 指点 C++ 的歧义算符
文 / 李博(光宇广贞) 在 C++ 中有很多带有歧义的算符,比如《C++ 0x 之左值与右值》中提到的“&”,再比如常用的“=”等。 这个“&”就很神通广大,不仅可以“取址”,还可以“取左值引用”;用在位运算中,表示“并且”。C++ 标准委员会当初在制定算符时,让 & 兼备“取址”和“取引用”的功能,是否考虑的是二者在含义上有相近之处?嗯……编译器在操作的时候的确原创 2009-09-17 18:54:00 · 2066 阅读 · 1 评论 -
扔掉 C / CPP 运行库包袱,缩减文件尺寸,可跨平台
文 / 李博(光宇广贞) 实验平台 VS 2010,具体信息见:《测试 VS 2010 对 C++ 0x 标准的谨慎支持》。 CRT 库是裹在 OS API 上的,所以用 C / CPP 写的程序能够运行。我们可以扔掉 CRT 库直接调用 OS API 完成动作,以此缩减文件尺寸。 首先指定程序入口。控制台程序默认入口是 main;Win 窗体程原创 2009-09-17 18:39:00 · 1917 阅读 · 1 评论 -
C++ 和 C# 二者 Lambda 表达式之异同
文 / 李博(光宇广贞)C++ 必须通过“捕获表达式”方可操作本地变量;而 C# 可以直接访问操作,因此 C# 不需要捕获表达式。 C++ 参数表达式必须标识小括号并指定参数类型,若无参,在参数表达式与函数体之间无可选项标识时可省略参数表达式;C# 里只有一个参数时,可不用标识小括号,可省略参数类型说明,若无参则需要用 () 标识。 C++ 里,若 Lambda 函数体不止一句 r原创 2009-09-13 19:41:00 · 1996 阅读 · 4 评论 -
函数式编程魅力:Continuation-Passing Style,说为何 C#、C++ 引入 Lambda 意义重大及 C++ 和 C# 的缺憾
文 / 李博(光宇广贞) CPS,Continuation-Passing Style,后继传递格式。 顾名思义,该格式就是向后接力传递一个东西,传什么呢?引述维基百科对 CPS 的定义如下: In functional programming, continuation-passing style is a style of programmi原创 2009-09-13 17:03:00 · 9531 阅读 · 4 评论 -
C++ 0x 之左值与右值、右值引用、移动语义、传导模板
文 / 李博(光宇广贞) 左值与右值 左值与右值的概念要追溯到 C 语言,由 C++ 语言继承了上来。C++ 03 3.10/1 如是说:“Every expression is either an lvalue or an rvalue.”左值与右值是指表达式的属性,而非对像的属性。 左值具名,对应指定内存域,可访问;右值不具名,不对应内存域,不可访原创 2009-09-11 09:42:00 · 11888 阅读 · 8 评论 -
C++ 0x 之移动语义和传导模板实现原理
文 / 李博(光宇广贞) 《C++ 0x 之左值与右值》文中提到 std::forward() 和 std::move()。本文开头对之补充一句: 在操作函数返回值或函数参数时,匿名左值仍然为左值,左值可以具名;匿名右值仍然为右值,右值一旦具名成功,立即转变为左值。 举一个例子。使用 std::move() 方法向 Outer 传递右值后,使用原创 2009-09-11 09:41:00 · 3938 阅读 · 1 评论 -
C++ 0x 之 Lambda 受 VS 2010 支持
译 / 李博(光宇广贞) C++ 0x 中,“Lambda 表达式”隐式定义并构造匿名函数对像,比如下例“Hello World”的 Lambda 表达式: 图一 这个 [] 就是 Lambda 前导算符,它通知编译器其后引导的是一个 Lambda 表达式。( int n ) 是 Lambda 参数表声明。{ cout 是 Lambda 构造的匿名函数的函翻译 2009-09-08 19:33:00 · 4615 阅读 · 2 评论 -
C++ try 块里 new 类对像构造异常时发生“回退”并对资源自动释放
考虑如下代码:void* operator new ( size_t size ){ printf ( "Malloc running! Size: %u/n", size ); return malloc ( size );}void operator delete ( void* memblock ){ printf ( "Fre原创 2009-08-19 19:12:00 · 3119 阅读 · 3 评论 -
C++ 类构造函数初始化列表的异常机制 function-try block
上篇文章提到了 C++ 类构造函数对成员变量初始化赋值时使用“初始化列表”的方式带来的好处。这篇文章将介绍另一个大大的好处——由初始化列表异常块机制带来的构造函数的安全性机制。 听起来有些拗口。直接上代码:class Fck{ int* sbArray;public: Fck ( int sbNum ); ~Fck ();原创 2009-08-17 22:27:00 · 7251 阅读 · 12 评论 -
C++ 构造函数初始化列表的好处
C++ 类对像构造时,需要对类成员变量完成初始化赋值操作。使用初始化列表完成这步操作在性能上有益处。什么好处呢?摆道理显得不够彻底。看书不如做实验。让我们结合执行过程来查看。考虑如下示例代码: Derive 类构造函数两个 Base 类型的参数,分别赋给该类两个 Base 类型的成员变量 b1、b2,一个使用初始化列表,一个使用等于号赋值。输出结果如下:原创 2009-08-17 21:28:00 · 7553 阅读 · 2 评论 -
VC++中使用内存映射文件处理大文件
http://blog.chinaunix.net/u2/75321/showart_1137227.html摘要: 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍。 引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、Write转载 2009-05-29 14:35:00 · 924 阅读 · 0 评论 -
关于构造函数不能是虚的的说法
http://www.cppblog.com/eidolondedidi/archive/2009/03/19/77180.html 看了这个,说得挺多,简摘几句,便足可以说明问题 虚函数对应一个vtable,这个vtable其实是存储在对象的内存空间的。若构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有。vtbl在构造函数调用后原创 2009-05-25 22:58:00 · 1539 阅读 · 0 评论 -
C++异常处理须知
http://blog.youkuaiyun.com/CARL_SEN/archive/2009/05/04/4148426.aspx第一部分:1.异常发生时,异常对象会沿函数调用栈的反方向抛出,这个过程常称为栈展开。2.在栈展开过程中,如果异常对象始终都没遇到可行的catch处理块,系统将调用terminate函数强制终止程序。当然如果连try块都没有,系统将直接调用terminate函数。转载 2009-05-24 20:16:00 · 3004 阅读 · 5 评论 -
移位操作的奇怪问题
http://topic.youkuaiyun.com/u/20090526/11/c3afa298-8223-444c-9fe3-59661c4f6ddf.htmlvoid main( ) { int iPos = 0; int iInc = -1; int iDst = 1 < < (iPos + iInc); cout < < iDst < <原创 2009-05-26 14:04:00 · 975 阅读 · 1 评论 -
find()、find_end()、find_first_of()、find_if()的使用示例和区别
http://blog.youkuaiyun.com/xqls_xqls/archive/2008/12/03/3437640.aspx#include #include #include #include #include using namespace std; int main(int argc,_TCHAR* argv[]){ //find_first_o转载 2009-05-28 02:08:00 · 2259 阅读 · 0 评论 -
Memcmp 与 Strcmp
http://blog.youkuaiyun.com/jcwKyl/archive/2008/03/25/2217428.aspxintel/strcmp.asm: mov edx, dword ptr [esp + 4] ;取第二个参数地址 mov ecx, dword ptr [esp + 8] ;取第一个参数地址 test edx, 3 ;edx是第二个参数的地址,这里即转载 2009-05-25 20:04:00 · 3797 阅读 · 0 评论 -
Win时间函数
我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍w转载 2009-05-22 12:07:00 · 1250 阅读 · 3 评论 -
char** ?char* ?
char**是指向char*的指针,而char*是一个int长度的数据,你声明了它,那么这个int型的数据便会有地址,而char**就是这个数据的地址。 首先你理解一下,为什么 char* 某些时候可以和 char[]等价呢?因为 char*指向的 a,实际上是 a[0]。所以 a 相当于 &a[0],它可以赋给 char* 但是char*只不过是 &a[0]罢了。和 char a[]是两回事儿,原创 2009-05-20 02:57:00 · 4700 阅读 · 3 评论 -
关于 const * 的问题
const char * const str .............编译的时候,const 修饰的是哪个?判断法:以 * 为界,const 居左,修饰类型;居右,则修饰变量。这是 const 编译的“就近原则”,也就是说 const 总是去修饰离它最近的那个“关键字或标志符”。故可以简单地以 * 为界来进行判断。注意,char[] 相当于 char * const,而非 c原创 2009-05-23 14:42:00 · 1908 阅读 · 0 评论 -
由 C++ 模板元编程看 F# 对链表的处理,兼谈 C 系语言和 FP 的优劣
有如下一段 C++ 模板元编程代码,求类型链表中最长类型的长度。// 求列表中字节最长的类型的字节长度值// 使用链表传递的思想:1::2::3::4::[]#include using namespace std;// 尾结点struct NullType;// 链表结点template struct TypeList;// 定义四结点链表原创 2009-08-09 19:13:00 · 2559 阅读 · 0 评论 -
由模板元编程看 VC 和 GCC 编译方式的不同
前作《从 C++ 模板元编程生产质数看 F# 函数式编程思想》一文中模板元编程代码,原文提出,在 VS 2010 平台下只递归到离 LAST 最近的一个质数便终止了向更深层的递归过程。这个问题我一直觉得奇怪,让我们这里重点看一下递归处的代码:template struct PrimePrint { enum { Prime = IsPrime ::原创 2009-08-11 12:38:00 · 2453 阅读 · 1 评论 -
C语言里面的嵌套声明的读法
http://topic.youkuaiyun.com/u/20090608/21/f8fc74c2-a419-4210-869a-1a70ece578e5.html int (*base[2])[2]; supermegaboy :base是一个数组,这个数组有2个元素,每个元素都是一个指针,这些指针所指向的对象是具有两个int元素的数组 C语言所有复杂的指针声明,都是由各原创 2009-06-09 16:32:00 · 2880 阅读 · 31 评论 -
一个整型数的二进制序列
http://blog.youkuaiyun.com/akirya/archive/2007/03/12/1527365.aspx templatestruct Bit{ enum { Data = ((Num << ( n - 1 )) & 0x80000000 ) ? 1 : 0 };};const int N = -4;char sz[]={ Bit:转载 2009-06-09 14:02:00 · 1329 阅读 · 2 评论 -
a++和++a的压栈
#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]) { int a = 1; printf("b = %d/tc = %d/td = %d/te = %d/tf = %d/tg = %d/n", a++, ++a, a++, ++a, a++, ++a ); system("原创 2009-06-09 13:22:00 · 1576 阅读 · 10 评论 -
关于判断某一个整型值内的1的个数
int HowMany1 ( int n ){ int count = 0; while ( n ) { n &= n - 1; count++; } return count;} n &= n - 1 用于判断 n 是否为 2 的次幂,如是,则 n 为零。也就是说 n &= n - 1 可以将原创 2009-06-06 12:30:00 · 1153 阅读 · 0 评论 -
C语言之#define用法
http://hi.baidu.com/apollo_hj/blog/item/95097b30599dc61feac4affe.html 一.#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在转载 2009-06-05 19:20:00 · 2510 阅读 · 2 评论 -
学C++的50个忠告
给C++初学者的50个忠告 1.把C++当成一门新的语言学习(和C没啥关系!真的。); 2.看《Thinking In C++》,不要看《C++变成死相》; 3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看; 4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是转载 2009-06-06 18:11:00 · 1550 阅读 · 4 评论