随笔分类 -  C++

多线程进行n皇后计算
摘要:在浏览zhihu的时候, 看到了这个问题:Linux c++服务器端这条线怎么走?http://www.zhihu.com/question/22608820 , 其中排第一的答案说的很不错。针对他结尾处给出的问题,一直想自己做一下,最近工作不忙,也写了以下,还是发现了一些自己存在的问题,总结一下吧。一个简单的8皇后问题可以比较容易的实现#include #include #include int cntTotal = 0;int BOARDSIZE=11;bool markboard(bool* b, int row, int col){ for(int i =row;i=0; ++i... 阅读全文

posted @ 2014-03-27 11:35 一颗麦粒 阅读(1581) 评论(0) 推荐(0)

chrome中tcmalloc的使用
摘要:chrome中内存分配采用了第三方库tcmalloc,这个库主要提供给应用程序内存管理方面的优化,按资料说内存存取速度会从300ns降到50ns。更具体的关于这个tcmalloc的信息大家可以查网上的资料看看, 本人对tcmalloc的实现不是很熟,这里主要向熟悉一下chrome的代码,主要说说 tcmalloc如何集成到了chrome中,通过研究这个,一是看看如何使用tcmalloc,另外可以对window下VC的内存C runtime的库有更多的了解。tcmalloc主要提供了自有的一套内存分配的函数,来替换我们常使用的new delete等VC++默认提供的内存分配实现。chrome中的 阅读全文

posted @ 2013-10-28 16:15 一颗麦粒 阅读(2114) 评论(0) 推荐(0)

Chrome中的消息循环
摘要:主要是自己做个学习笔记吧,我经验也不是很丰富,以前学习多线程的时候就感觉写多线程程序很麻烦。主要是线程之间要通信,要切线程,要同步,各种麻烦。我本身的工作经历决定了也没有太多的工作经验,所以chrome的messageloop可以说是我用到的第一个成熟的线程消息封装库,用的很简单,舒服。主要涉及MessageLoop和MessagePump这两个类系。以前不太清楚chrome当时在设计这两个类时是如何分工的,今天又看了一下代码,有了点感觉。MessagePump主要用来做消息循环, 与操作系统等平台相关的部分都在MessagePump类里, 针对不同的平台有不同的实现,对messageloop 阅读全文

posted @ 2013-10-15 13:58 一颗麦粒 阅读(2636) 评论(0) 推荐(0)

一个基本算法题暴露出来的C++基础不扎实
摘要:好久没有写算法了,写算法都手生了,这可不利于找工作呀,打算坚持每周看一下算法方面的相关知识。今天是第一次,所以就入门一下吧,看了一下鸡兔同笼的问题。问题如下:问题描述一个笼子里面关了鸡和兔子(鸡有2 只脚,兔子有4 只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物输入数据第1 行是测试数据的组数n,后面跟着n 行输入。每组测试数据占1 行,包括一个正整数a (a < 32768)。输出要求n 行,每行输出对应一个输入。输出是两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用空格分开。如果没有满足要求的情况出现,则输出2 个0。 阅读全文

posted @ 2013-06-01 23:56 一颗麦粒 阅读(7341) 评论(0) 推荐(0)

C++对象模型学习
摘要:《深度探索C++对象模型》这本书看了2遍了,第一遍时很多东西懵懵懂懂,似懂非懂,在看时就比较清楚了。想着对比书上的理论,写点代码来验证一下,应该理解会更深刻些。这篇博客中先记录一下第三章的内容-data语意学。所有的代码都是在vs2008中编译。p84(1):一个空的class内存占用是一个字节,这样的两个空对象就能够在内存中各自分配一个独一无二额地址class CTst{ };p84(2): 如下代码的大小是4个字节(ms vc 环境下)class CSecond : public virtual CTst{};这个CSecond的大小受3个因素的影响:语言本身所造成的额外负担编译器对于特殊 阅读全文

posted @ 2012-03-22 22:43 一颗麦粒 阅读(1003) 评论(0) 推荐(0)

C++中在指定的内存位置,调用构造函数
摘要:在之前写了一篇随笔,但是查了资料后,感觉理解的有问题,所以从新总结下,原文在分割线下。C++中运算符new的使用,我们在教科书中学到的就是创建一个对象并初始化。其实他可以分成两个步骤:配置内存初始化Point3d *origin = new Point3d;会被c++编译器解析成如下伪码:Point3d * origin;if(origin = __new (sizeof(Point3d))) origin = Point3d::Point3d(origin);也就是解析成两步,第一步是采用new 运算符来分配内存,第二部是调用构造函数来初始化对象。在VC的代码中,<new>中包括 阅读全文

posted @ 2011-12-30 14:45 一颗麦粒 阅读(6609) 评论(0) 推荐(0)

C++中创建一个对象
摘要:刚看完了侯捷的《stl源码剖析》,很不错的一本书,打算对着vc的stl源码来验证一下。 而所有的C++对象第一步就是创建,我看了一下new中得代码,大概做个记录吧。理解的不深,纯做记录而已。class CA{public: CA(void); ~CA(void); //void* operator new (size_t size);};CA::CA(void){}CA::~CA(void){}//void* CA::operator new (size_t size)//{// return malloc(size);// //}这个类中我注掉的代码就是重载了该... 阅读全文

posted @ 2011-12-27 15:04 一颗麦粒 阅读(5740) 评论(0) 推荐(0)

C++编码规范 学习笔记
摘要:今天上了培训C++编码规泛的课,这里做个回顾吧,强化记忆一下。成员变量在构造函数的初始化列表里进行初始化,否则,系统会生成一个临时对象,然后再赋值给成员变量。尽量使用抛异常的方式来处理非常规问题。如果要使用错误码,错误码的含义要一致。构造函数使用explickit,可以禁止掉一些默认的类型转换。(未确定)函数的名字要有含义,大小写规则要遵守嵌套括号不能多于5层。assert在release版本下是没有作用的。对于指针的使用,尽量使用智能指针来进行资源的自动释放。(RAII)对代码做profiling分析 G—profiling要有赋值构造和拷贝构造函数。就记得这么多了 阅读全文

posted @ 2011-09-06 22:01 一颗麦粒 阅读(239) 评论(0) 推荐(0)

手动编译和链接 程序
摘要:现在每天的开发都是使用vs 2005, 这个IDE为我们做了很多的事情,包括项目文件的管理和编译生成可执行文件等。为了对其背后的原理做一下了解,我用手动的方式来编写和生成简单的dll和exe,希望能对整个流程有个了解。创建一个dll文件先是dll文件部分,我定义了一个头文件和2个cpp文件,分别的代码如下//mydll.h#ifndef MyDllAPIHeader#define MyDllAPIHeader#ifdef MyDllAPI#else#define MyDllAPI extern "C" _declspec(dllimport)#endifMyDllAPI i 阅读全文

posted @ 2011-07-23 12:53 一颗麦粒 阅读(531) 评论(0) 推荐(0)

VC中BSTR和CString的使用
摘要:BSTR在头文件中的定义如下:typedef WCHAR OLECHAR;typedef OLECHAR*BSTR;所以BSTR的实际类型其实就是WCHAR*。在MSDN中的Allocating and ReleasingMemory for a BSTR一文中,强调了在使用这个类型时,要在内存上小心对待,以避免发生内存泄露。对于从函数中传出的BSTR,接受的对象要负责对这个BSTR的内存进行管理。在该文中列举了三种情况:当在一个函数中使用BSTR时,你要负责分配和销毁它,代码如下:// shows using the Win32 function// to allocate memory f 阅读全文

posted @ 2011-07-15 21:05 一颗麦粒 阅读(25368) 评论(0) 推荐(0)

C++中多继承和类型转换
摘要:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include"stdafx.h"structIX{virtualvoidFX()=0;};structIY{virtualvoidFY()=0;};classCA:publicIX,publicIY{virtualvoidFX(){printf("CA->FX()\n");}virtualvoidFY(){printf("CA-> 阅读全文

posted @ 2011-02-12 10:43 一颗麦粒 阅读(418) 评论(0) 推荐(0)

The difference between static_cast and dynamic_cast
摘要:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//static_cast_Operator_2.cpp//compilewith:/LD/GRclassB{public:virtualvoidTest(){}};classD:publicB{};voidf(B*pb){D*pd1=dynamic_cast<D*>(pb);D*pd2=static_cast<D*>(pb);}if pb really points t 阅读全文

posted @ 2011-01-21 19:57 一颗麦粒 阅读(258) 评论(0) 推荐(0)

visp配置
摘要:第一步:装vs2008, opencv, cmake ,doxygen, graphviz, gsl, dx2007_8第二步,配置GSL增加GSL_DIR环境变量,由于gsl安装没有生成lib文件,我们要自己手动生成。通过控制进入到gsl安装目录下lib子目录下输入以下2个命令: lib /machine:i386 /def:libgsl.def 和 lib /machine:i386 /def:libgslcblas.def,就生成了lib文件,用cmake查看了下,还是没有自动检测到。然后打开FindGSL.cmake这个文件,发现好像对于gsl的文件名配置的不正确,我将Code hig 阅读全文

posted @ 2010-11-30 16:43 一颗麦粒 阅读(832) 评论(0) 推荐(0)

《C++编程规范》学习笔记(4)编程风格
摘要:第14条 宁要编译时和连接时错误,也不要运行时错误能在编译时做的事情,就不要推迟到运行时。运行时的检查取决于控制流和数据的具体情况,很难知道检查是否彻底。 静态检查与数据和控制流无关静态表示的模型更加可靠静态检查不会带来运行时开销。编译时多态。定义泛型函数或类型时,考虑用编译时多态(模板)代替运行时多态(虚拟函数)。前者产生的代码能够更好地进行静态检查。(item 64)。枚举。在表示符号常量或受限整数时考虑定义enum向下强制。 如果经常使用dynamic_cast(或者更糟糕的static_cast),则可能说明基类提供的功能太少了。对于非得运行时检查的情况,应使用断言来检查内部编程错误( 阅读全文

posted @ 2010-11-29 20:53 一颗麦粒 阅读(219) 评论(0) 推荐(0)

《C++编程规范》学习笔记(3)
摘要:第12条 懂得何时和如何进行并发性编程如果应用程序使用了多线程或进程,要知道如何尽量减少共享对象,以及如何安全地共享必须共享的对象。参考目标平台的文档,了解该平台的同步化原语。最好将平台的原语用自己设计 的抽象包装起来,方便移植确保正在使用的类型在多线程程序中使用时安全的 在自己编写可用于多线程程序的类型时,必须完成2个任务:必须确保不同线程能够不加锁地使用该类型的不同对象。其次,必须在文档中说明使用者在不同线程中使用该类型的同一个对象需要做什么,基本的设计问题是如何在类以及其客户之间分配正确执行的职责。主要的选择有外部加锁:调用者负责加锁。内部加锁:每个对象将所有对自己的访问串行化,通常采用 阅读全文

posted @ 2010-11-29 20:08 一颗麦粒 阅读(255) 评论(0) 推荐(0)

《C++编程规范》学习笔记(2)
摘要:第4条:在代码审查上投入审查代码:更多的专注有助于提高质量 。亮出自己的代码,阅读别人的代码。互相学习,彼此都会受益。---------------------------------------------------------------设计风格 第5条:一个实体应该只有一个紧凑的职责一次只解决一个问题:只给一个实体(变量、类、函数、名称空间、模块和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。这个类似于面向对象的单一模块单一职责原则。 第6条:正确、简单和清晰第一软件简单为美:正确优于速度。简单优于复杂。清晰优于机巧。安全优于不安全。要避免使用程 阅读全文

posted @ 2010-11-16 21:52 一颗麦粒 阅读(213) 评论(0) 推荐(0)

C++编程规范学习笔记(1)
摘要:第0条:不要拘泥于小节只规定 需要规定的事情,不要强加个人爱好或过时的做法不要使用晦涩的名称使用全大写表示宏 C++编程规范中不应该使用匈牙利记法(将类型信息并入变量命中) 第1条:在高警告级别干净利落的进行编译 高度重视警告,使用编译器的最高警告级别。 理解所有警告,通过修改代码而不是降低警告级别来排除警告无法修改的库头文件可能包含引起警告(可能是良性)的构造。如果这样,可用自己的包含原头文件的版本将此文件包装起来,应有选择的为该作用域关闭烦人的警告,然后在整个项目的其他地方包含此包装文件Code highlighting produced by Actipro CodeHighlighte 阅读全文

posted @ 2010-11-12 22:35 一颗麦粒 阅读(184) 评论(0) 推荐(0)

导航