
C++
文章平均质量分 72
dqjyong
这个作者很懒,什么都没留下…
展开
-
g++ 编译动态链接库和静态链接库
现在我有hello1.cpp和hello2.cpp两个文件,现在我要生成动态链接库libhello.so和静态链接库libhello.a。以下为步骤:1.生成动态链接库:g++ -m32 hello1.cpp hello2.cpp -fPIC -shared -o ../lib/linux32/libhello.so -m32为生成32位的动态链接库,-m64位生成64位的动态链接原创 2014-03-25 19:20:39 · 18554 阅读 · 0 评论 -
深度解析线程同步
1.如果不考虑线程切换开销和cpu空转 一个线程处理作业速度为什么快过2个线程轮换处理? 使用多线程,处理同步的开销应该也是有的,win32的多线程中,保证同步,都会用一个 waitforsingleobject()函数之类的,进行等待,然后就是保证同步,在win32中就会使用关键段,互斥器,信号量,事件中的一种,那么在初始化这些对象的过程和销毁的过程也是要额外的开销.2.既然多线原创 2012-08-10 12:57:49 · 1517 阅读 · 0 评论 -
C++ const与指针关系
关键字const在c++编程语言里面有着非常重要的江湖地位,同时也是各大公司笔试题的关注点。 下面简要介绍一下const与指针的关系。 char greeting[]="hello"; const char*p=greeting;//定义一个常量数据,而不是指针常量 char* const p=greeting;//定义一个指针常量,而不是定义常量数据原创 2012-08-10 20:49:34 · 1214 阅读 · 0 评论 -
2013 网易校园招聘试题考点
出于保密的原因,具体的题目就不说了,主要是我们不是为了做题目而分析题目,而是要将考点弄懂浓透。下面列举出本次试卷中的考点: 1.给定入栈顺序,求出可能的出栈顺序。(点评:老得掉渣得题目了,只要小心点都没有问题) 2.给定一个表达式,说出其后缀表示形式。例如给定X=A+B*(C-D)/E,求出其后缀表达式。 3.四叉原创 2012-10-10 21:54:46 · 4047 阅读 · 4 评论 -
字符串数组的全排列到八皇后问题详解
1.记得在一次面试终要求写一个程序,程序题目为:输入字符串的全排列:例如输入字符串为abc,那么他的全排列有abc,bac等六种。尝试确定输入字符串的全排列,并输出。字符串全排其实是一个数学问题,根据数学计算可以知道,程序的复杂度为O(n!),并且没有比较明显的改善算法。比较常见的算法都是将问题变为一个子问题,然后对子问题进行反复迭代,得出最终的结果。而子问题就是采用字母固原创 2012-08-11 23:01:22 · 2163 阅读 · 0 评论 -
c++ reference counting引用计数原理
我们都知道,c++最令人头疼的问题也是被其他语言鄙视的问题——指针管理。而引用技术能够让上面的简化了不少。下面说说c++引用计数的设计原理。 引用计数的两个动机: 1. 简化heap对象周边的记录工作。对于分配在heap中得内存,如果没有显式delete它,那么就会常驻在内存区间,引起内存浪费。而且在heap对象的所有权会随着复制和赋值出现转移,原创 2012-09-18 21:29:51 · 2014 阅读 · 0 评论 -
c/c++ 未知的陷阱——2元、3元转义字符
在编写程序时需要时时提防编译器背着我们干一些没有通知我们做的事,下面列举转义字符对程序的影响。 首先列出二字符组和三字符组对应的意思。 二元字符 等价字符 [ :> ] { %> } %:或者%% # 三元字符 等价字符 ??原创 2012-10-08 16:06:54 · 3000 阅读 · 0 评论 -
声明还是表达式?二义性?如何避免?
通过一个实例来引出本文要阐述的问题。具体的代码为: deque test; copy(istream_iterator (cin), istream_iterator (), back_inserter(test)); 上面的代码很明显是先声明了一个名为test的deque容器,并将其初始化为空。然后,将从标准输入流(ci原创 2012-10-08 12:42:01 · 1691 阅读 · 0 评论 -
c++ shared_ptr智能指针使用注意事项
shared_ptr在boost中地位相当重要,其行为最接近原始指针,但又比指针更加安全,甚至还能提供基本的线程安全保证。它基本上解决了在使用c++开发过程中不可避免的使用指针而遇到的许多问题,常见的毫无疑问是内存泄漏和内存的提前释放,还有一些关于指针内存申请而产生的异常问题等。而要想较好的使用shared_ptr来完全取代指针绝非易事。下面简要说说使用shared_ptr需要注意的问题。原创 2012-09-16 15:04:09 · 12392 阅读 · 1 评论 -
c++ 实现static const对象在类声明中指定初值
在早期的c++ 编译器中无法在class的定义区为static const member(这里的member必须为整数类型int、char、enum等)赋初值,而晚些的c++编译器可能可以这么做。但是const member的使用习惯是在定义的时候赋值,并且在其他的地方不能改变其值。所以,这就形成了矛盾,使得我们大部分时候而不得不将放弃使用static const member。下面的代码即为此种原创 2012-09-16 17:08:45 · 1930 阅读 · 0 评论 -
c++ inlineing内联函数不要使用static对象
我们知道inline内联函数的效率比一半函数的效率要高,而在绝大部分的c+编译器将函数优化为内联函数。而内联函数是不是万能的呢?如果与内联函数与static对象结合使用会出现什么样的效果呢?下面将具体分析分析。 内联函数的作用是将函数体部分在编译器展开,类似与宏的效果,而不像普通的函数一样会用到局部堆栈对象,以及保存函数进入、返回地址。因此内联函数的效率比一半函数高。 正是由于这种原创 2012-09-16 16:28:09 · 2905 阅读 · 2 评论 -
c++ static的作用,以及static对象在类和函数中区别
static对象如果出现在类中,那么该对象即使从未被使用到,它也会被构造以及析构。而函数中的static对象,如果该函数从未被调用,这个对象也就绝不会诞生,但是在函数每次被调用时检查对象是否需要诞生。下面详细说说static的功能以及它的来龙去脉:static作为编程语言里面一种重要的数据类型,它的地位在面试的过程里也是相当的高。为什么要引入static 函数内部原创 2012-09-13 21:38:23 · 21405 阅读 · 5 评论 -
c++ 将构造函数虚化,动态产生对象
我们知道构造函数有一个必须遵守的规则,即构造函数不能定义为虚函数。但有一个具体的应用是要求是在不同的场景下通过一个指针或者引用生成不同的对象,这就类似于类型的动态生成,即在执行期才能确定具体的对象。这怎么实现呢? 下面我们介绍两种方法: 1.不管是在effective c++ 还是在设计模式中,提到的一种特别的替代继承的方法,即组合。采用组合的方法来实现构造原创 2012-09-13 21:21:33 · 1510 阅读 · 0 评论 -
用代码的角度看C++虚函数、虚继承的影响
一直以来,c++的虚函数以及虚继承令人讨厌。下面通过程序彻底了解c++的虚函数以及虚继承。#include using namespace std;//查看虚函数表classB{};classB1{public:B1(){cout<<"B1 constructor"<<endl;};//构造函数不能为virtual函数};classB2:public B1{publi原创 2012-09-04 22:07:39 · 920 阅读 · 0 评论 -
c++ 嵌套new操作构造对像的执行顺序
突然比较好奇如果在某中class对象在拷贝构造时的函数调用顺序,下面用代码说清楚我的问题: 定义class object,class object { public: ... protected: ... private: ...}上面定义一个object类,假设其操作都为默认原创 2012-09-16 18:06:33 · 1709 阅读 · 0 评论 -
linux使用shared_ptr出现错误
我在不同的系统下采用下面的方式使用shared_ptr以及vector:std::vector > pointer_arrays;std::vectorbject > >::const_iterator pointer_Iter;并采用如下初始化:const std::shared_ptr object(new Object);wordDataTab.push_back(objec原创 2014-04-14 18:44:00 · 9409 阅读 · 0 评论 -
centos 上更新g++版本
最近要用结巴分词开源库的c++版本,由于其推荐使用gcc4.6以上的版本,所以我不得不对我的gcc进行升级。幸好我是在centos上进行升级,而centos上有,并且最简单的方法是升级到g++4.7版本。下面就说说是如何升级g++的:打开终端,依次输入以下命令:cd /etc/yum.repos.dwget http://people.centos.org/tru/devtools/原创 2014-03-04 18:07:21 · 19831 阅读 · 0 评论 -
JNI使用:设计综述
JNI接口函数以及指针示意图:可以看到,JNI接口设计类似于c++的虚函数表或者COM接口。使用函数表而不用硬连接函数入口(hard-wired function entries)的方式的好处有:JNI命名空间与native代码相隔离。VM能够简单的提供多个版本的JNI函数表。例如,VM可能支持两个JNI函数表:1. 其中一个执行参数非法检查,另外一个用来调试;2.其中一个执行翻译 2014-03-03 21:18:20 · 3184 阅读 · 0 评论 -
JNI: API的调用
什么都不说,我们先来看代码: #include /* where everything is defined */ ... JavaVM *jvm; /* denotes a Java VM */ JNIEnv *env; /* pointer to native method interface */ JavaVMI原创 2014-02-27 21:49:16 · 8835 阅读 · 0 评论 -
Xcode4.6发布了
apple的Xcode4.6.2版本在4月15号已经发布了,看了一下其新功能,发现了一些新的亮点: 1、更加准确的代码补全启发以及优化默认的数据集; 2、新的编译器标注使用ARC和弱引用产生的潜在bugs; 3、最高兴的一点是增加了对c++ 11的自定义标识以及非限制的联合体支持; 4、调试过程中可以观察NSArray原创 2013-04-24 12:54:45 · 1317 阅读 · 0 评论 -
C++面试时的知识盲点
1、声明与定义的区别;2、模板与重载相比,有什么优点?3、模板与宏相比,有什么好处?4、auto_ptr与vector一起使用,会有什么问题/5、嵌套类如何构造?6、virtual public和public virtual之间的区别?7、8、模板与多态之间的区别?9、模板类中模板成员函数与静态方法。10、友元与嵌套类的区别?11、如何使用友元模板?12原创 2013-03-23 19:58:44 · 1572 阅读 · 0 评论 -
C++ boost库学习之——Smart Pointers
智能指针是用来存储动态分配给对象的指针的对象,与C++内置的指针十分相似,但是智能指针能够在合适的时间自动删除对象,从而释放空间。智能指针在遇到异常时尤其有用,因为它能够确保动态分配对象的正确析构。同时,智能指针还可以对多个拥有者共享的动态分配对象进行跟踪。 智能指针可以抽象地认为是拥有指向对象的对象,因此当不再需要动态分配的对象时,智能指针会负责释放对象。 智能指原创 2013-03-11 14:55:47 · 2023 阅读 · 0 评论 -
c++ 继承机制易犯的错误
继承作为面向对象的基本特征之一,其使用率极高。不管是为了实现软件的基本功能,还是再程序的重构的过程中,我们总是会用到继承机制。正是因为其用途极为广泛,而且使用简单,大众程序员对其真正的内部实现机制的探究不是很深。而且,在大部分情况下,我们对继承的使用方法是错误的。下面用例子来说明问题。class Animal { public: Animal &operator=(原创 2012-09-19 17:05:10 · 1449 阅读 · 0 评论 -
纯虚函数能为private吗?
我们把一个仅仅含有纯虚函数的类称为接口,我们也好像已经习惯了将这个接口中的所有纯虚函数全声明为public,而且按照这样的设计,一切都工作得不错。比如COM正是这样做的,它的接口中几乎不会存在private的纯虚函数。那么,让我们想一想,纯虚函数或者虚函数可以为private吗?如果这种方式是可行的,那么什么时候可以将(纯)虚函数设为private了?这些都是本文将要讨论的主题。一起来看看。转载 2012-11-24 10:51:38 · 1237 阅读 · 0 评论 -
c++学习历程
我的学习技术历程主要为书本知识学习,项目经验积累。从最初的课堂上学习《c语言程序设计》,然后自学《c++ primer》,对c++的语法有了较清晰的认识之后,开始着手研究c++编程效率的书籍,类似于《effective C++》和《more effective C++》,《c++编程思想》等。学习完了这些之后,有时我会对比同一段代码在不同的编译器下得出的不同结果,这令人困惑的结果在《深度探索C原创 2013-01-17 13:13:04 · 1676 阅读 · 0 评论 -
为什么自己写的快速排序要比algorithm命名空间下的sort要慢?
最近几天一直被poj上的一个题目困扰着,倒不是问题有多难,而是老是超时,而且超时不打紧,要命的是程序的主要耗时程序为排序部分,自己写的如下快速排序代码:void swap(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } int partition(int num原创 2012-12-30 00:12:26 · 3640 阅读 · 1 评论 -
c++ 声明与定义的区别
在c++的使用过程中,经常听到变量的定义、声明,也经常出现两者定义随意混用的情况,其实两者的差别还是比较大的。两个术语的英语定义为:Declaring is like telling the machine that you want say for example, the variable "x" to exist, you can also set it to somethi原创 2012-11-09 18:34:59 · 1093 阅读 · 0 评论 -
采用new分配内存失败时为什么会出现两种错误报告方式?
在c++语言中,我们经常会使用new给一个对象分配内存空间,而当内存不够会出现内存不足的情况。c++提供了两中报告方式: 1.抛出bad_alloc异常来报告分配失败; 2.返回空指针,而不会抛出异常。 c++为什么会采用这两种方式呢?这主要是由于各大编译器公司设计c++编译器公司的结果,因为标准c++是提供了异常机制的。例如,vc++6.0中原创 2012-10-05 21:50:45 · 4452 阅读 · 0 评论 -
c++ 虚继承与继承的差异
前面一篇文章,说明了在C++ 虚继承对基类构造函数调用顺序的影响。经过仔细推敲,发现没有彻底说清楚虚继承与普通继承之间的关系。所以用下面的文字再说明一下。首先,重复一下虚拟继承与普通继承的区别有:假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;假设derived 虚继承自base类,那么原创 2012-09-28 20:51:47 · 32446 阅读 · 3 评论 -
C++ 虚继承对基类构造函数调用顺序的影响
继承作为面向对象编程的一种基本特征,其使用频率非常高。而继承包含了虚拟继承和普通继承,在可见性上分为public、protected、private。可见性继承比较简单,而虚拟继承对学习c++的难度较大。首先,虚拟继承与普通继承的区别有:假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;假原创 2012-09-28 15:57:37 · 14701 阅读 · 2 评论 -
网易面试题之求出树的直径
给定一颗二叉树,求出树中的任意两个节点之间的最大距离,即树的直径。 从这个题目可以看到,树中任意两个节点的最大距离,显然应该是不同叶子间的最大距离。我们可以根据树的节点分布情况分情况考虑如何求树的直径。 情况1:对于一般的树,根结点的左子树与右子树平衡,如图1。左子树与右子树的叶子节点的最大距离,应该为左子树的深度加上右子树的深度,然后加1,即为树的直径。原创 2012-08-02 23:00:59 · 6060 阅读 · 1 评论 -
二叉树操作的基本操作
节点定义:typedef struct Node{ int data; Node* rChild; Node* lChild;} *BinTree;创建2叉树:int array[31]={1,2,4,8,0,0,9,0,0,5,10,11,0,0,0,0,3,6,12,0,0,13,0,0,7,14,0,0,15,0,0};void Create原创 2012-08-02 23:44:56 · 1151 阅读 · 0 评论 -
新~研发中心、人~搜索面试题
实现memcpy函数; VC++ new的底层内存分配函数为? 设计一个满足大数相乘的数据结构? 线程阻塞的实现。 负载均衡设备有? 敏捷开发? SQL并发运行造成死锁? 霍夫曼树的路径长度? 编码与解码:原创 2012-08-02 13:38:41 · 1002 阅读 · 0 评论 -
面试题(2012年7月)
红黑树与平衡二叉树的区别: 红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。AVL树的复杂比起红黑树来说简直是小巫见大巫。红黑树是真正的变态级数据结构。 Objective C中NSArray中有元素为nil,那么对NSArray中元素的影响。 类的构造函数为private属性时,类原创 2012-08-02 13:31:43 · 1324 阅读 · 1 评论 -
面试题(2012年6月)
C++:为什么在模版中不能用虚函数? 模版是泛型编程,编译器会根据参数进行特化生成对应的函数原型,即在编译期确定模版到底属于哪一种。而虚函数在运行期确定到底调用哪个函数,运行只是知道偏移位置为多少。c++接口是如何工作的?static关键字的应用场景有哪些?在成员函数中调用”call this“会怎么样?在成员函数调用”delete thi原创 2012-06-15 22:53:16 · 1762 阅读 · 1 评论 -
c++内存分配函数之间的区别
malloca/alloca: 内存分配函数,与malloc,calloc,realloc类似。但是注意一个重要的区别,_alloca是在栈(stack)上申请空间,用完马上就释放。 alloca包含在头文件malloc.h中,在某些系统中会宏定义成_alloca使用。 注意: 1.在调用 alloca的函数返回的时候, 它分配的内存会自动释放。也就是说, 用原创 2012-06-27 21:31:03 · 1747 阅读 · 0 评论 -
如何学好c++,还是好好看书籍吧!
在程序员的江湖中,编程语言就相当于每一位行走在IT江湖中侠客的兵器。不同侠客随身携带的各种各样的武器就相当于程序员掌握的各种各样的编程语言。而c++语言作为每一位程序员必备的编程语言,c++在兵器谱的排名上一直占据着榜首的位置。如何让每一位侠客熟练使用自己的兵器,让兵器更好的提升自己武功,侠客必定是想尽一切办法去寻找武功秘籍。程序员如何能够提升自己的能力,最常见的是找到最经典的书籍,熟练掌握了这些原创 2012-06-11 00:44:00 · 1084 阅读 · 0 评论 -
c++ 可重载运算符和不可重载运算符
我们知道重载的定义为,在一个类中公用同一个方法名,但是参数类型或者参数个数不同。如果仅仅有方法返回值类型不同,不能构成函数的重载。 上面仅仅说了函数的重载,还有一些操作符重载呢? 还是先列出c++有哪些操作符吧! 操作符可分为9个大类,分别为: 1.赋值运算符:‘=’,注意这里不是等于的意思,只是单纯的赋值原创 2012-06-22 17:02:32 · 11671 阅读 · 1 评论 -
Objective-C、C++以及C之间的区别
随着ios开发的兴起,Objective-C语言收到了广大移动开发者的青睐。而传统的使用最广泛的语言c++在不同的操作系统、不同的应用平台上继续发挥自己的能量。可以看到,前面两种语言都一个共同的字母—c,毫无疑问预示着c语言相当于这两种开发语言的母亲(不能认为是鼻祖,因为还有汇编、机器语言等)。那么三者的关系与区别到底有哪些呢? 历史: C:一九七八年由AT&T的原创 2012-06-14 17:21:41 · 23075 阅读 · 2 评论 -
注意MAC系统XCode开发工具与Windows下VC++对类成员对象布局的不同
看到侯捷老师的深度探索C++对象模型中data语义学中单一继承而且没有虚继承的数据布局中Concrete1、Concrete2、Concrete3的对象布局,发现在MAC系统下这种继承的方式与老师的观点不一致。特提出来供大家讨论。侯捷老师在书中P105的图为:而在MAC下单一继承而且没有虚继承的数据布局与上面有明显的不同。啥也不说,还是直接上代码吧!#include u原创 2012-06-01 22:15:21 · 2175 阅读 · 0 评论