怎样用谷歌搜索代码c++ 代码知乎

如何系统地学习 C++ 语言?
【蓝色的回答(113票)】:
由于我大一也陷入过迷茫,也走过一些弯路,那时候学不会直接记忆代码之类的事情我都干过,我也希望我的这些经验可以对你有所帮助。
首先是一本好的C++书籍(Accelerated C++, C++ Primer),然后以及尽量多的完成书籍的习题,可以帮助完成C++语法的学习。虽然前面的书籍涵盖了标准库,但是不够完善,这个时候你可以选择在线查阅C++标准库这种泛型的学习方式,也可以选择阅读Nicolas的《C++标准库》的方式进行学习。通过这样的步骤,你应该可以完成C++的初步学习了。
然后,由于C++是一门系统级语言,我想你需要到大三学习操作系统的时候,才会明白栈与堆、内存管理等更深层次的含义。但是,在明白这些概念之前不会妨碍你利用C++做一些事情,比如写一个简单的XML Parser。这个时候,你应该会发现很多问题,如效率,代码规范等,这个时候,你可以研究Effective C++,Google C++ Code Standard等,只有自己犯了错,回过头反省才会更加深刻。
随后,你可以更加深刻的去思考C++,你需要阅读《The C++ Design and Evolution of C++》。这本书的阅读,会教会你很多,是对你影响最大的C++书籍。如果你对C++编译器的一些细节有兴趣,深入C++对象模型可以推荐。如果你对STL的一些实现有兴趣,可以去翻翻STL源代码(很多人推荐STL源码剖析,但是我没有阅读,我确实没有读过,我没有办法发表是否应该推荐的观点,列出来供你自行判断是否应该阅读)。
到这一步骤,我想你应该可以称为C++ Programmer了,剩下的就是实践中发现问题,然后补足自己。
此外,由于C++博大精深,应用的范围多如牛毛,特定方向所需要的知识未列举。比如你要研究Android的NDK什么的,那就是属于你后面的事情了。
【徐辰的回答(3票)】:
C++是一门用来“解决问题”的语言,如果你没遇到需要用C++来解决的问题,你不会有太大的动力去系统的学习C++。
还是从发现问题开始吧,学点Python、Ruby之类上手快的语言,做点有用没用的东西,等到哪天你发现遇到了一个不能解决的问题再回过头来学C++也好,学Java也好,有针对性就容易出结果了。
【知乎用户的回答(4票)】:
推荐Stackoverflow上的C++书单:
其中beginner级别的都很系统化。建议根据你已有的C++经验选一个合适的级别然后随便挑一本看(每个级别有至少一本有中文版),慢慢提升以后再看更高级别(beginner-intermediate-advanced)。
【知乎用户的回答(3票)】:
师傅领进门修行在个人。
关于技术类的书籍很多,像 @蓝色 提到的 Accelerated C++, C++ Primer。 提到的书单都很好。
这方面就不扯了。想在这给你介绍可以一起学习的一群人。
在coursera上,北京大学开设的互动课程
课程信息名称:
by Jiaying Liu 刘家瑛, Ph.D., 郭 炜
不得不说这门课讲的很不错!课程设有讨论区,有不懂的可以在讨论区与大家讨论,学习氛围很好,现在课程已经更新到第九周了,如果你是单纯想学知识,快去学习吧。
授课大纲:
第1周 从C走进C++
第2周 类和对象初探
第3周 类和对象进阶
第4周 运算符重载
第5周 继承与派生
第6周 多态与虚函数
第7周 文件操作和模板
第8周 标准模板库STL (1)
第9周 标准模板库STL (2)
第10周 枚举算法
第11周 递归算法
第12周 动态规划算法
第13周 深度优先搜索算法
第14周 广度优先搜索算法
这是真理-&学这个要多动手练习;
【陈波的回答(1票)】:
找一本书翻来覆去认认真真看几遍,边看边想边写,基础打劳了,其它东西也就是水到渠成了。
【王月的回答(1票)】:
学了一学期c++ 但对编程 感觉还是无从下手 可能是练得比较少吧 现在想好好学 c++ 该怎么学呢坦率的说,这段描述和标题不太相称,题主对自己的实际情况和C++这门语言都缺乏清醒的认识。建议题主把思路定位在
【入门】上,而非
【系统的学习】。一旦
【入门】了,兴趣和经验会驱动后续学习。
题主要问问自己,为什么一学期过去了,仍然无从下手?以下两个问题请题主坦率的回答自己:
1、C++对你重要吗?一定要学吗?
相比搭讪、泡妞什么的,C++绝对不是非学不可的东西。如果你觉得重要,那是你意识到并渴望C++可能会带来的快感和价值。
2、适合自己吗?
C++并不适合所有人,让陈道明、莫言或者姚明去学这玩意儿就是胡来。和很多编程语言一样,C++有两条基本要求:
其一,想象力;
其二,逻辑性。
【抽象】是个极重要的概念,可哪个
【抽象】不是建立在想象上的?
内存的实际结构并不是黑板上画的那样成排的格子;指针也不是真有个大头针在内存里指来指去;friend不是俩class真的会基情四射;继承不代表
【父类】过世了;电脑里从来就没有什么窗户。所有这些都要求初学者良好的想象力。猜测:题主所谓的
【无从下手】就是缺乏
【抽象】的能力。
【白发三千丈,缘愁似个长】这种想象是CS里要不得的,这只会导致 overflow。编程还需要第二个必备条件:逻辑性。这个实在太重要了,孱弱的逻辑性会让人举步维艰。个人体会:跟逻辑太弱的人讨论C++是种煎熬。总之,逻辑和想象都发达且平衡的人适合玩这个。用MBTI描述的话,大约相当于NT这个类型,ST也成,就是入门慢点儿。
若这俩问题都可以
【给自己】作出坚定、正面的回答,那剩下的事儿就简单了:
【C++ Primer】读完,并把习题尽量做完(后面有些内容暂时用不上,可适当从略)。
2、有问题就找人讨论,或者po到StackOverflow上。
而后,想象力和逻辑性会决定走多远。
===============================
题主居然是妹子。。妹子不去修炼怎么勾引男人,弄这劳什子干嘛?
大概题主有奇志,那补点儿技术面的。
C++的学习曲线公认的又臭又长,但窃以为还是有要害可抓的。
【指针】。
C++至少有三个和指针直接相关的概念,分别是引用、iterator和智能指针。
引用往往是依靠指针实现的(注:没记错的话,standard里没有规定引用的实现细节,多数编译器是用指针来实现引用),iterator和指针密切相关,智能指针可类比为指针套个马甲。总之,指针是这三个概念的基础。然后再来看看这些东西在C++里的作用:
1、稍大一点儿的对象就要靠引用或指针来传递;
2、容器要用指针来搭;
3、STL算法库依赖iterator;
4、动态内存要用指针或智能指针来管理;
5、C++1y的move操作依赖右值引用;
6、OO里的继承和多态依赖指针或引用;
7、变参数模板依赖右值引用;
上述哪个不是C++的要点、难点?建议题主花点儿时间熟练掌握指针的各种用法,然后再开始全面的C++学习,这样会快感很多。
【知乎用户的回答(1票)】:
为何我从来不觉得C++有那么难学,为何有那么多人去抠那些C++语言细节?
C++相对于C来说,只是一种编程思想的发展,C++编译器只不过顺便把这种思想的实现细节透明化,让你更专注用好这种思想去编程。的确,C++因应这种编程思想,多了一些语法规范,但这些知道有这么回事就行了,用到时现查也无妨,多用几次自然就熟悉了。
实际上,使用C++编程更忌讳滥用面向对象思想,不是所有功能都需要用类的形式去实现,它只在构建一个系统时才能显示出自己的优势。
所以,我觉得你先学好C编程,掌握好指针的使用,顺带看一本C++书就可以了,剩下的就是自己构思一个有意义的项目去做,学以致用才是最实际的能力。最终你会发现真正掌握C++意味着你学会使用更多的库,而不仅仅是那些语法。
【知乎用户的回答(0票)】:
需要先理解计算机工作原理(顺便学习一种汇编语言),然后学C++ 的C子集,加深对硬件模型的理解,最后学习面向对象和泛型。
【李辉的回答(0票)】:
先得找一个靠谱的编译器/开发环境,然后对着书折腾吧。
话说当年在大学,课上讲的是TC,书上说的是MFC,Linux都在玩桌面…
尝试学c++在MFC里用dialogbox看输出,那叫一个蛋疼啊。
直到工作后用gcc或者vc里的命令行工程。
【火星队长的回答(0票)】:
首先要明白,主流编程语言分为两大类:一类是面向过程的语言,比如C;另一类是面向对象的语言,如python,java,c#,C++等。
——————————————————————————————————
1.建议先把C搞清楚,至少基本语法没啥大问题,然后C++基本就是一些OO的思想加上C的语法(当然一些细节不太一样)。
2.初学者极容易陷入cpp那浩瀚无垠的语法细节之中,建议先认真理解一些OO的基本思想,如:封装,继承,多态,运算符重载,类,对象等等,先把自己编程的思想从面向过程转到面向对象,具体的语法细节前期不要纠结太多。
3.其实软件涉及到很多学科,语言知识一门工具,初学者不要把所有的精力都投入到编程语言的学习上,多花点精力和时间学习操作系统,编译原理,汇编,数据结构等等,系统的学习将来会有助于你的发展,否则,你可以code的很久很久,还是一个码农。
4.编程时实践性很强的东西,纸上得来终觉浅,很多时候你去面试,HR一句话“废话不多说,放码过来”,你就知道什么是“读书千遍,不如代码一行”了。
5.不要仅仅局限于实现细节,等有一定的基础后,建议看一些uml和设计模式的书籍,有利于向更高层次的发展。
6.不要仅仅在课堂上跟着老师的步伐走,一定要注意课下的自学,师傅领进门,修行在个人。
7.life is too short to learn cpp,不要沉迷于自己的那片小天地中,多锻炼,多与人交流。
【知乎用户的回答(0票)】:
【知乎用户的回答(0票)】:
同上,多练。
我也只有在毕业设计写了成千上万的代码的时候才理解的C++的许多概念,何况做的只是初级的MFC。
靠上课的教材和习题妥妥不够用,当然先把它做完了再说。
习题之外,做感兴趣的项目也是有必要的,比如打下java基础后写点app。
【王安的回答(0票)】:
第一步:放下书本,找一个设计优秀的C++代码库或者应用程序来看。可以是一个小型的引擎(例如Ogre的超早期版本,一个网络库),或者是你感兴趣的其它领域的优秀代码。一定是大家认可的,设计优秀的代码。看到不懂的不论是语法还是用法,就去查就去问。
第二步:自己拿这个库写一些应用程序,比如如果是Ogre你就写一个超小型游戏,如果是网络库你就写一个小型IM。
第三步:拿起书本,找那基本大家公认的“解决实际问题”的C++书来看,比如Effective C++那些,但不要看C++ Primer这种大部头,这种是“工具书”,有问题去查,没问题就放那放着。这时候你经过第一步已经对C++语法基本熟悉了,并且经过第二步你会碰到一些实际问题,所以看一些解决实际问题的东西会很有效率,认识也会很深。
第四步:按着上面看书看到的知识,去修改第二步自己写的东西。
第五步:如果还有时间就按着你的想法去修改一开始你看到的那个库,把它改成属于你的库。这一步很可能是失败的,也是有始无终的,但拆过优秀的东西才能真正明白别人写的为啥优秀。这个过程学习的不止于C++还有设计和专业知识。
不推荐一开始就看书特别是大部头的书,因为对基本的东西都没什么认识,人家说的能解决什么问题也不知道,看了也是白看。
【子昂的回答(0票)】:
我觉得你可以先从C开始学起,通过基础语言的学习,把基础打好。然后在学什么VC、Java这些面向对象的语言就简单的多了。还有就是学习编程不能靠及代码,编程语言这东西我是一种理解性的、结构性的东西。如果可以的话,可以选择看一些《XXX编程思想》的书,梳理一下自己的思路和知识结构。在就是在网上找些案例看看,由简入深。
【林作健的回答(0票)】:
哥,你不学编译原理,怎么可能“系统地”学习任何一门语言?
【黎酱的回答(0票)】:
有个网站我觉得特!别!好!
就是不教c++............
【史永宏的回答(0票)】:
写啊,大学写够百万行再说
&&&&&本文固定链接:
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣!
最新日志热评日志随机日志准备实现一个图像检索系统,B/S结构,不知道服务器端的c++程序怎么和web进行交互呢?
现在我想做一个图像检索系统,像百度搜图那样的,算法已经写好了,可以实现给一张图片返回相似图片,现在问题是怎么把这个变成一个B/S结构,图像检索功能放在服务器端,浏览器上传图像检索,然后服务器处理后返回若干图像到浏览器显示,打算开一个线程池每来一个用户用一个线程处理。算法是用c++写的,懂一点javascript,php不太懂,大概怎么做呢?现在不要求美观什么的、只要能实现功能即可。--------------------------补充一下:我之前做过一个东西,就是把算法方面的东西封成DLL,然后服务器端简单的写个while循环使用TCP与客户端通信,客户端也通过TCP把图像传给服务器程序。现在相当于要把这个客户端程序变成基于Web的。服务器端的程序得一直运行着,因为这部分启动的时候会加载很多数据到内存里。另外,我现在遇到的这种问题属于什么问题呢?服务器端编程问题呢还是架构问题呢还是。。。因为以前自己写代码没涉及过服务器,对这些概念不太清楚,因此查资料都不知道问题的类型不知道该用什么关键字。能推荐些资料或者提示下该学什么东西最好了!谢谢大家的回答。
按时间排序
搭个web应用就行了,我用python的tornado搭建的,算法调用c++封装库就ok了,有个简单demo: 还有一个15w数据的鞋子检索:
RPC,WebService什么的都ok。裸socket比较麻烦
楼主既然懂c++那就用c++做一个简易的web服务器就行了。。。。。
我突然想到我写过的一个项目,用javascript写的图像检索系统。。
你项目的重点是那个C++的 DLL,如果 java和 python基础都没用过,那用 php最快,C++熟悉入门php一天而已。要调用动态库,php的 php_ffi,或者 php_w32api两个模块都能帮你干这事情:php_ffi:&?php
dl ("php_ffi.dll");
$windows = new ffi ("[lib='user32.dll'] int MessageBoxA( int handle, char *text, char *caption, int type );" );
echo $windows-&MessageBoxA(0, "Message For You", "Hello World", 1);
php_w32api:&?php
// 定义所需的常量,来自
// Visual Studio/Tools/Winapi/WIN32API.txt
define("MB_OK", 0);
// 加载此扩展
dl("php_w32api.dll");
// 注册 GetTickCount 函数,来自 kernel32.dll
w32api_register_function("kernel32.dll",
"GetTickCount",
// 注册 MessageBoxA 函数,来自 User32.dll
w32api_register_function("User32.dll",
"MessageBoxA",
// 取得开机时间信息
$ticks = GetTickCount();
// 转换为易于理解的文本
= floor($ticks / 1000);
= floor($secs / 60);
$hours = floor($mins / 60);
$str = sprintf("You have been using your computer for:".
"\r\n %d Milliseconds, or \r\n %d Seconds".
"or \r\n %d mins or\r\n %d hours %d mins.",
$mins - ($hours*60));
// 显示一个消息对话框,只有一个 OK 按钮和上面的开机时间文本
MessageBoxA(NULL,
"Uptime Information",
前面有提到gearman的,在实习的时候接触到了gearman,题主可以搜一下相关介绍,它是一个任务分发框架,挺适合的你的需求。web端可以使用php来接受图片上传,php端可以将图片相关信息发送到gearman,然后c++端负责从消息队列取任务,检索或者其他相关图像处理操作,然后返回结果图片的url。实习的时候接触到图像处理流程大概就是这样的
自己写了一个CBIR web应用,,这个是演示系统。自己在写的时候写的很简单,特征提取用到了卷积网络,到现在比较流行的caffe在vps上相当麻烦,所以直接把特征提取好后,后台其他的处理就用python写的,写得很简单,用的pycherry服务,简单的用了下余弦距离去匹配。后面还会把它搞得像样点。回到题主的问题,如果题主对c++以及php的c++接口(或者说c++的php接口)很熟悉的话,实现起来问题应该不大。我当时写这个的时候,后台还借用的python的一个跟matlab通讯的第三方库。后来想着在vps上俺总不能安装个matlab吧,所以就把特征这一块直接提好了。python大法真好,整个下来不超过30行代码,而且代码经过优化后,查询的速度还可以接受。用手机码字真特么不方便,~~~~(&_&)~~~~ -------------------------------------------------------------------------------------------------搬了一天砖,已将图库扩展到3w,下面是在PC浏览器里检索演示过程(只支持库内查询):进去时的界面喜欢哪张图片,就猛击它,比如点击;上面图中的老虎,检索结果如下:喜欢哪张图片,就猛击它,比如点击;上面图中的老虎,检索结果如下:好了,先补充到这里。好了,先补充到这里。
我给楼主一个建议, 用c++做具体的算法比如特征提取(feature extraction) 和模型训练(e.g.SVM training) 以及必须的preprocessing 和postprocessing。这样你比较容易做一个基于c++的core lib(可重用性和封装,做法算c++有效率的优势)。然后business logic层建议用java 会省掉你很多编码调试的工作 而且如果你想做成restful的webservice的话用java要简单的多, 就因为在webapp这块 java的现成代码和库要比c++丰富太多了。 然后你用JNI在java的代码里调用你的c++core layer(做成DLL的比较方便)的函数就可以, 这里要注意c++库里不能有static或者全局的变量, 后则你想实现一个query一个线程会有问题。Bunisess logic层你可以用最简单的servlet/JSP, 如果要做restful service的话直接上Jersey, 这些技术的学习成本非常低,1-2周搞定。前台不要用plain javascript, 用jquery+ajax 去给你的后台的servlet 发http request就可以了。 之所以不见你用httpd 这样的c++ webapp 库是因为 如果你还是学生 学习这些技术的回报率太低, 学java的web framework 你很快能达到行业标准水平,从servlet/JSP -& spring /hibernate 你能学到跟多设计的知识而不是单纯写程序。 c/c++的优势在于效率, 所以用他们做底层算法最适合。
题主其实就是后台想全部用自己熟悉的c++,前端自己随便写写就可以了。这样也不难,c++实现一个简单的web server也不难,而题主目前主要是不知道c++这边怎么和web前端交互。那要去看http协议,就知道怎么传了。c++这边就需要你解析下http协议就可以了。
题主是要做一个web应用,处理http协议最为方便的还是利用现有的web服务器(nginx/lighttpd/...)。在此基础上,需要用C/C++实现算法逻辑的话,提供如下两个思路:1.用C写一个CGI插件迁到http服务器中,参考()但这个真只能做demo,而且题主说需要预加载一堆数据配置之类的,这样效率很低。2.在Web服务器和C检索逻辑之间加一层脚本处理层(php/python/...),做三层架构,
比如:http server --& php-cgi---& C服务器http服务器和脚本交互都有现有的协议(phpcgi/wsgi/...)。脚本层负责处理一些简单的页面逻辑,可以当做view层吧。在接收到上层http请求后,做简单处理就可以把请求发给后端C检索服务器了。核心检索模块,采用C写一个服务器,监听上层的脚本请求。服务器模型最简单的,开启一个监听socket,然后开始while循环,accept到请求后,read出上游参数后,开始执行检索逻辑(也就是题主已实现的算法),将计算结果write出去,进入下一轮监听处理...想做复杂,可以考虑多线程/进程/epoll,或用现有的一些高并发框架(libevent/...)。那堆需要加载数据或者配置,只需要在C启动的时候Init一次就行了。至于脚本层与C进程之间的交互协议,可以自己编写简单的协议,但更推荐用一些现有的RPC协议(protebuf/thrift/...)。如果后端有多个服务器可供选择的时候,一般用random或者round-robin就行,有特殊需要可以考虑一致哈希。
注意定义好各层之间的输入输出如果这套框架真的run起来了,题主以后只需要关心检索模块的算法部分就行,其他的页面功能优化就交给php攻城狮去干吧。后端服务hold不住了,直接加机器就行,如果觉得不够优雅,再考虑加cache,或者优化网络模型等,根据瓶颈作调整。。。
我有个思路是C++程序根本就不去管网络的事情,只负责处理检索;可以用php或者任何你用得顺手的后端语言简单的做一个接收上传图片的页面,图片上传完毕唤起C++程序工作,C++结束后将结果返回给前端。再进一步可以做成异步的,接收程序接收完图片生成一个任务ID,把任务插入一个任务队列,并把ID返回给前端,前端可以拿这个ID查询结果(这个可以用php等很简单的实现)。这样的好处是支持横向扩展,请求量大的时候只需增加运行C++程序的机器就可以了,大家共享任务队列,并行处理。
用fastcgi即可。
cython可以干这个事,或者用队列消息
可以试试用gearmanweb用php,python,go,javascript写都可以后端就使用C处理
做一层简单的cgi封装就可以跑起来了,可用组件和库有很多,比如cgicc,或者我以前写的webapplib,不建议引入重量级web框架。
如果想用HTTP的话可以用Casablanca……是个 c++的rest api
这个问题比较宽泛,常见的做法可以是这样的,C++运行在专门的业务服务器上,然后用Socket与Web服务器连接。
已有帐号?
无法登录?
社交帐号登录定时器要能够在指定的时间异步执行一个操作,比如boost库中的boost::asio::deadline_timer,或MFC中的定时器。而且能够被取消执行。最基本的,能够在x86和x64架构上的Win、Mac和Linux操作系统下实现。
异步执行的话另开定时器线程loop sleep就好了,使用堆或者set存储。如果是同步的话则可以在主循环里定时检查,Linux下则有更好用的timer fd或者alarm。
一个Timer的实现需要具备以下几个行为:&br&&ul&&li&StartTimer(Interval, ExpiryAction)&br&&/li&&/ul&注册一个时间间隔为 Interval 后执行 ExpiryAction 的定时器实例,其中,返回 TimerId 以区分在定时器系统中的其他定时器实例。&br&&ul&&li&StopTimer(TimerId)&br&&/li&&/ul&根据 TimerId 找到注册的定时器实例并执行 Stop 。&br&&ul&&li&PerTickBookkeeping()&br&&/li&&/ul&在一个 Tick 时间粒度内,定时器系统需要执行的动作,它最主要的行为,就是检查定时器系统中,是否有定时器实例已经到期。&br&&br&具体的代码实现思路就是:&br&在StartTimer的时候,把 当前时间 + Interval 作为key放入一个容器,然后在Loop的每次Tick里,从容器里面选出一个最小的key与当前时间比较,如果key小于当前时间,则这个key代表的timer就是expired,需要执行它的ExpiryAction(一般为回调)。&br&&br&这里有两个实现的细节:&br&&ol&&li&获取当前时间&br&&/li&&/ol&
包含时间精度,使用系统时间还是CPU时间(asio里的deadline_timer和steady_timer的区别)&br&
常用的API是:&br&
Windows: QueryPerformanceFrequency() 和 QueryPerformanceCounter()&br&
Linux: clock_gettime()&br&
OSX: gettimeofday()或者mach_absolute_time()&br&
当然在C++11里也可以偷懒使用chrono的high_resolution_clock &a href=&/?target=http%3A///w/cpp/chrono/high_resolution_clock& class=&internal&&std::chrono::high_resolution_clock&/a&&br&&br&2.timer容器的选择&br&&br&
容器应该能够在很短的时间内找到MinValue&br&
最小堆的find-min复杂度是O(1),所以蛮受人喜欢的&br&
STL里提供有堆的API,make_heap, push_heap, pop_heap, sort_heap&br&&br&3. PerTickBookkeeping是放在主循环线程还是另起线程&br&&br&另起线程需要做好线程间通信,asio和skynet有单独的timer线程&br&&br&一些代码实现:&br&&br&这是boost.asio的实现的timer_queue,用的是最小堆&br&&a href=&/?target=https%3A///chriskohlhoff/asio/blob/master/asio/include/asio/detail/timer_queue.hpp& class=&internal&&asio/timer_queue.hpp at master · chriskohlhoff/asio · GitHub&/a&&br&&br&这是libuv的timer,采用的是红黑树实现(windows),linux下还是最小堆&br&&a href=&/?target=https%3A///libuv/libuv/blob/v1.x/src/win/timer.c& class=&internal&&libuv/timer.c at v1.x · libuv/libuv · GitHub&/a&&br&&br&这是云风的skynet timer实现,采用链表实现&br&&a href=&/?target=https%3A///cloudwu/skynet/blob/master/skynet-src/skynet_timer.c& class=&internal&&skynet/skynet_timer.c at master · cloudwu/skynet · GitHub&/a&&br&&br&&br&参考:&br&&a href=&/?target=http%3A///developerworks/cn/linux/l-cn-timers/index.html& class=&internal&&Linux 下定时器的实现方式分析&/a&
一个Timer的实现需要具备以下几个行为:StartTimer(Interval, ExpiryAction)注册一个时间间隔为 Interval 后执行 ExpiryAction 的定时器实例,其中,返回 TimerId 以区分在定时器系统中的其他定时器实例。StopTimer(TimerId)根据 TimerId 找到注册的定时器实…
谢邀~MFC或者说win32 api的计时器是在windows message loop里的,可以看成main里有个for(;;){} 无限循环,掐时间触发计时器事件。因为同时还要处理其他窗口事件,精度不高,但处于主线程中,方便调用其他窗口函数。没用过boost的定时器,不清楚。不过可以按上面的想法实现一个跨平台的计时器。
谢邀~MFC或者说win32 api的计时器是在windows message loop里的,可以看成main里有个for(;;){} 无限循环,掐时间触发计时器事件。因为同时还要处理其他窗口事件,精度不高,但处于主线程中,方便调用其他窗口函数。没用过boost的定时器,不清楚。不过可以…
已有帐号?
无法登录?
社交帐号登录
Detail Makes Failure一直在学习C++,也想阅读点开源的C++项目,发现网上对Google
V8评价不错,于是上Github上找到了源代码,发现有很多branched和tags,不知道都表示啥。想好好看看源代码,求知乎大神们给个建议!附上引擎github地址 :
新手如果通过v8学c++,估计在成功编译之前就放弃了。
题主只是想学习C++,并不是对JavaScript引擎的实现本身感兴趣对不对?&br&如果是的话,请不要从V8开始学习。这不是适合新手阅读的东西。特别是新的版本简直复杂,没足够知识储备看了也是白看。&br&&br&硬要看的话,请从非常早期的版本开始看。这是0.1.5的tag:&a href=&///?target=https%3A///v8/v8/releases/tag/0.1.5& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Release 0.1.5: Made the prototype property of functions enumerable. · v8/v8 · GitHub&i class=&icon-external&&&/i&&/a&&br&要浏览文件的话,在这里:&a href=&///?target=https%3A///v8/v8/tree/3a1ab8c626dfee28a5cafbc4cffb3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&v8/v8 at 3a1ab8c626dfee28a5cafbc4cffb3 · GitHub&i class=&icon-external&&&/i&&/a&&br&此时的V8还相对简单一些,但已经包含许多在当时的JavaScript引擎看来非常先进的做法了,例如tagged pointer。而V8实现tagged pointer用的是很奇妙的C++奇技淫巧,真的不太适合新手用来上手…题主看下面这个函数能看懂不?&br&&a href=&///?target=https%3A///v8/v8/blob/3a1ab8c626dfee28a5cafbc4cffb3/src/objects-inl.h%23L94& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&v8/objects-inl.h at 3a1ab8c626dfee28a5cafbc4cffb3 · v8/v8 · GitHub&i class=&icon-external&&&/i&&/a&&br&&div class=&highlight&&&pre&&code class=&language-text&&bool Object::IsSmi() {
return HAS_SMI_TAG(this);
&/code&&/pre&&/div&HAS_SMI_TAG宏的定义在:&a href=&///?target=https%3A///v8/v8/blob/3a1ab8c626dfee28a5cafbc4cffb3/src/globals.h%23L368& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&v8/globals.h at 3a1ab8c626dfee28a5cafbc4cffb3 · v8/v8 · GitHub&i class=&icon-external&&&/i&&/a&&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&cp&&#define HAS_SMI_TAG(value) \&/span&
&span class=&cp&&
((reinterpret_cast&int&(value) & kSmiTagMask) == kSmiTag)&/span&
&/code&&/pre&&/div&如何?&br&&br&网上有不少介绍V8的特性的文章其实写的都是初期的V8,配合它们读初期的V8代码倒是不错。如果真要读的话,有啥具体问题欢迎在知乎提问讨论 ^_^&br&我这儿有个老帖,或许能对题主有用:&a href=&///?target=http%3A//hllvm./group/topic/37596& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[链接帖] 各JavaScript引擎的简介,及相关资料/博客收集帖&i class=&icon-external&&&/i&&/a&
题主只是想学习C++,并不是对JavaScript引擎的实现本身感兴趣对不对?如果是的话,请不要从V8开始学习。这不是适合新手阅读的东西。特别是新的版本简直复杂,没足够知识储备看了也是白看。硬要看的话,请从非常早期的版本开始看。这是0.1.5的tag:
新手的不太建议读v8源代码。我记得某个v8的developer在wingolog一系列关于v8分析的文章(&a href=&///?target=https%3A//wingolog.org/tags/v8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&posts tagged &v8&&i class=&icon-external&&&/i&&/a&)的comment里,或者是Lars,曾经提到v8不是用来学的,因为它存在的目的就是为了最高性能,里面用了大量的奇巧淫技,比如说small integer表示,比如说把浮点数转化成字符串的Grisus3算法(&a href=&///?target=http%3A///publications/dtoa-pldi2010.pdf%3Fattredirects%3D0& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/pub&/span&&span class=&invisible&&lications/dtoa-pldi2010.pdf?attredirects=0&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&). 另外,处于速度考虑,v8和普通的编译器/虚拟机不太一样,没有太多control flow analysis和data flow analysis(至少我看的时候是这样)。&br&&br&需要知道的是,Lars原来是做Hotspot VM的,里面大量的思想来自大神Urs H?lzle。大名鼎鼎的on stack replacement,polymorphic inline cache等等完全可以在Urs H?lzle二十年前的博士论文里可以找的到,所以要看懂v8这些理论少不了; V8里的hydrogen指令更是用来自Hotspot的C1Visualizer可以看,所以我想如果要学习的话,还不如先看看wingolog的这一系列v8文章:&a href=&///?target=https%3A//wingolog.org/tags/v8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&posts tagged &v8&&i class=&icon-external&&&/i&&/a&,以及Urs H?lzle的博士论文和相关论文&a href=&///?target=http%3A//i.stanford.edu/pub/cstr/reports/cs/tr/94/1520/CS-TR-94-1520.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&i.stanford.edu/pub/cstr&/span&&span class=&invisible&&/reports/cs/tr/94/1520/CS-TR-94-1520.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,最后最好还要熟悉virtual machine的实现。比如各种GC算法,不然看v8里的对象管理你就直接晕了。&br&&br&有了这些理论打底,熟悉一般的compiler和virtual machine implementation,而且还熟悉ecmascript spec,熟悉C++的话,倒是可以开始看了...&br&&br&但如果你这些都熟悉,那看v8干嘛呢?给它做code review? &br&&br&比较有意思的是这些理论都熟悉了,然后&b&比较各种javascript的实现&/b&。比如在对象表示上mozilla就不是v8的smi tag,而是利用NaN boxing;比如是直接inteprete还是像v8那样有highlevel IR和lowlevel IR;等等。这才是有意思的地方呐
新手的不太建议读v8源代码。我记得某个v8的developer在wingolog一系列关于v8分析的文章()的comment里,或者是Lars,曾经提到v8不是用来学的,因为它存在的目的就是为了最高性能,里面用了大量的奇巧淫技,比如说small integer表示,比如…
已有帐号?
无法登录?
社交帐号登录
软件工程师

我要回帖

更多关于 谷歌搜索框劫持代码 的文章

 

随机推荐