现在位置: 首页 > c++
问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> class Widget; // uses "class" template<typename T> class Widget; // uses "typename" 答案:没什么不同。在声明一个 template type parameter(模板类型参数)的时候,class 和 typename 意味着完全相同的东西。一些程序员更喜欢在所有的时间都用 class,因为它更容易输入。其他人...
阅读全文
2014-11-07 07:12 工业·编程 ⁄ 共 10130字 暂无评论
std::set/std::map (以下用 std::map 代表) 是常用的关联式容器,也是 ADT(抽象数据类型)。也就是说,其接口(不是 OO 意义下的 interface)不仅规定了操作的功能,还规定了操作的复杂度(代价/cost)。例如 set::insert(iterator first, iterator last) 在通常情况下是 O(N log N),N 是区间的长度;但是如果 [first, last) 已经排好序(在 key_compare 意义下),那么复杂度将会是 O(N)。 尽管 C++ 标准没有强求 std::map...
阅读全文
2014-11-05 12:15 工业·编程 ⁄ 共 7426字 暂无评论
今年8月,经过投票, C++14标准获得一致通过。目前唯一剩下的工作是ISO进行C++标准的正式发布。在本文中,我关注的是新标准中的几个重要点,展示了即将到来的改变会如何影响你的编程方式,特别是在使用被现代C++称之为习语和范型的特性时。 C++标准委员会决心使标准制定过程比过去10年更加快速。这意味着,距上一个标准(即C++11)仅3年的C++14是一次相对较小的发布。这远非一个令人失望的消息,恰恰相反,这对程序员来说是个好...
阅读全文
本文主要讨论 Linux x86 平台,会继续举 Windows/COM 作为反面教材。 本文是上一篇《C++ 工程实践(4):二进制兼容性》的延续,在写这篇文章的时候,我原本以外大家都对“以虚函数作为接口”的害处达成共识,我就写得比较简略,看来情况不是这样,我还得展开谈一谈。 “接口”有广义和狭义之分,本文用中文“接口”表示广义的接口,即一个库的代码界面;用英文 interface 表示狭义的接口,即只包含 virtual function 的 class,这种 cl...
阅读全文
2014-10-30 06:51 工业·编程 ⁄ 共 4335字 评论 1 条
本文主要讨论 Linux x86/x86-64 平台,偶尔会举 Windows 作为反面教材。 C/C++ 的二进制兼容性 (binary compatibility) 有多重含义,本文主要在“头文件和库文件分别升级,可执行文件是否受影响”这个意义下讨论,我称之为 library (主要是 shared library,即动态链接库)的 ABI (application binary interface)。至于编译器与操作系统的 ABI 留给下一篇谈 C++ 标准与实践的文章。 什么是二进制兼容性 在解释这个定义之前,先看...
阅读全文
版本管理(version controlling)是每个程序员的基本技能,C++ 程序员也不例外。版本管理的基本功能之一是追踪代码变化,让你能清楚地知道代码是如何一步步变成现在的这个样子,以及每次 check-in 都具体改动了哪些内部。无论是传统的集中式版本管理工具,如 Subversion,还是新型的分布式管理工具,如 Git/Hg,比较两个版本(revision)的差异都是其基本功能,即俗称“做一下 diff”。 diff 的输出是个窥孔(peephole),它的上下文有...
阅读全文
本文只考虑 Linux x86 平台,服务端开发(不考虑 Windows 的跨 DLL 内存分配释放问题)。本文假定读者知道 ::operator new() 和 ::operator delete() 是干什么的,与通常用的 new/delete 表达式有和区别和联系,这方面的知识可参考侯捷先生的文章《池内春秋》[1] ,或者这篇文章 。 C++ 的内存管理是个老生常谈的话题,我在《当析构函数遇到多线程 》第 7 节“插曲:系统地避免各种指针错误”中简单回顾了一些常见的问题以及在现...
阅读全文
匿名 namespace (anonymous namespace 或称 unnamed namespace) 是 C++ 的一项非常有用的功能,其主要目的是让该 namespace 中的成员(变量或函数)具有独一无二的全局名称,避免名字碰撞 (name collisions)。一般在编写 .cpp 文件时,如果需要写一些小的 helper 函数,我们常常会放到匿名 namespace 里。muduo 0.1.7 中的muduo/base/Date.cc 和 muduo/base/Thread.cc 等处就用到了匿名 namespace。 我最近在工作中遇到并重新思...
阅读全文
  在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。 例如,下面的结构各成员空间分配情况: struct test {   ...
阅读全文
其实能让c语言变得更强大的就是函数指针了,他可以让更少的代码做更多的事情,可以减少很多的重构成本....... 来看一个简单实用的例子: #include "stdio.h"  #include "stdlib.h"  #include "string.h"         int ReturnMaxValue(int left, int right)  {      return (left > right) ? left : right;  }...
阅读全文