V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  FrankHB  ›  全部回复第 88 页 / 共 92 页
回复总数  1830
1 ... 80  81  82  83  84  85  86  87  88  89 ... 92  
2015-06-13 02:34:00 +08:00
回复了 jjtx 创建的主题 C C++模板会不会增加冗余
……嘛,严格来说是否有重复编译的冗余还是得看你调用编译器的方式。
如果直接扔给编译器驱动所有源文件,比如g++ test.cpp test2.cpp -otest,这样至少理论上还是能够优化的,虽然我实际上没看到这样的优化实现能明显改善(-flto倒是会调用make……)。
而如果非得g++ -c test.cpp -otest.o; g++ -c test2.cpp -otest2.o然后ld或者g++链接这些.o的话,就没救了,因为现在几乎所有系统上这样都是让每次翻译在单独的进程里跑,而除了链接时-flto这样的黑科技外我还没见到有神到会自主IPC优化的C++编译器……
(然而大部分现实项目都是后者的方式分批构建的,所以效率嘛。。反正make -j是救不了的。)
2015-06-13 02:17:53 +08:00
回复了 jjtx 创建的主题 C C++模板会不会增加冗余
解决所有以上冗余的避免方法根本上都一样:把定义固定到确定的具体翻译单元中。然而这样会导致inline函数和模板的定义只有一个翻译单元能看得见,实际上没用。好在C++11引入了extern模板声明,允许显式指定不在当前翻译单元实例化,配合显式实例化就能基本消除这个开销(inline就看着办吧……)。
至于写头文件里会导致暴露实现,考虑到export这样的实现方式因为过于复杂、收益不够被毙了,是没办法解决的——根本上就是要标准化一种IL代替源码(反正得能让各家编译器都认识)表示实例化之前的东西,不可能是最终的目标代码,也就是五十步笑百步而已。
源码上只是要分离实现也不是不行,类似libstdc++这样把大段模板定义写到另外的文件里再包含,但技术上照样是头文件——只不过提醒用户没事别看罢了。当然写模板定义特别是类模板定义外的成员定义需要多几个template<>非常疼,自己看着办吧(反正我是没兴趣特别这样搞)。
2015-06-13 02:04:59 +08:00
回复了 jjtx 创建的主题 C C++模板会不会增加冗余
@YuJianrong export只有EDG前端实现,而且C++11就移除了,关键字保留给以后用。
2015-06-13 02:03:41 +08:00
回复了 jjtx 创建的主题 C C++模板会不会增加冗余
按照现在的编译器的一般实现基本不可能避免冗余。
不仅仅是模板,inline函数(不管最终是否被内联)、没有定义在翻译单元内的多态类的虚表(Clang++警告[-Wweak-vtables])也是这样。
然而因为One Definition Rule的要求,链接时必须去除这些在不同翻译单元中完全相同的代码生成的相同的外部链接的实体。所以链接完以后的映像中是不会允许这些重复的定义。坏处主要是编译效率低下以及浪费空间:做了很多重复的无用功。
根本原因是C++的翻译链接模型是对称的,没有一个中心翻译单元。没有额外的特殊约定,编译器每次翻译过程中直接生成的目标二进制映像只对这一个一个翻译单元有意义,再次编译其它翻译单元时之前已经翻译好的目标代码不会被复用。于是对于头文件这种在预处理后每个翻译单元都有重复的东西,就只能重复翻译了。而跨翻译单元的优化也得推迟到链接时。
2015-06-13 01:53:20 +08:00
回复了 durami 创建的主题 C c/c++的算法及数据结构的书求推荐
@durami 也不见得非得看书。了解一下算法分析的常识,然后找些自己有兴趣的实际问题解决。剩下的基础迟早会被逼得会用。
2015-06-10 00:20:16 +08:00
回复了 durami 创建的主题 C c/c++的算法及数据结构的书求推荐
@durami 把二级忘掉,返工。
要算法之类的也不用太关注具体语言。
2015-06-08 23:39:38 +08:00
回复了 FinalDream 创建的主题 程序员 在招人时什么样的 Github 能让你眼前一亮呢
@Dongdong36 这人还曾公开喷GitHub除了code hosting以外(编辑,pr)几乎一无是处呢: https://github.com/torvalds/linux/pull/17。你确定跟这里那么多star党谈得拢么。
2015-06-08 23:32:03 +08:00
回复了 FinalDream 创建的主题 程序员 在招人时什么样的 Github 能让你眼前一亮呢
@dast B语言之父偷换成了Java之父……虽然都有偏执狂倾向但是等级完全不一样。有你这么黑的么。
2015-06-08 17:40:37 +08:00
回复了 durami 创建的主题 C c/c++的算法及数据结构的书求推荐
@lijianying10 我对先前内容的正确性本身没有异议。但我不同意“毕竟传统的书籍都是串行算法,不适用当前的云时代了”这个说法——即便算法本身用不上,算法分析的一般方法、和实现结合的许多惯用法仍然都是相同或类似而可以参照的;而专门讲解并行算法的文献大多不会有耐心复述一遍这些较为经典的内容。
我同意你先前的回答可能会对不少人有帮助,不过从问题来看(正如你所说的“也许你提这个问题说明您是个初学者”),恐怕题主难以利用这些资源。
然而面向非初学者,问题涵盖的范围可以很大,方向也有很多,也并非一定侧重高性能计算。
所以我建议先缩小一下范围(或许可以让题主明确一下感兴趣的问题领域),以便更能有针对性。
2015-06-06 14:35:52 +08:00
回复了 bwangel 创建的主题 C C 语言的语法问题
@bwangel 逗号的功能不一定是“分隔语句”。
首先你得了解,C的语法中逗号并不都是一回事。有些逗号只是标点而不是操作符,如函数调用的postfix-expreesion中的分隔参数的逗号;而逗号表达式里的逗号操作符是另一回事。
最重要的影响语义的差异之一是,前者不限定求值顺序,而后者会插入一个sequence point。这里没有这个坑,但不知道迟早被坑。
语句之间是有sequence point的。从这个意义上来看,逗号操作符可以认为是在“分隔语句”。虽然实际上更像是个应付语句可用性缺陷设计的workaround(嘛,while条件里塞不进语句咋办……用逗号擦屁股吧)。而其它逗号,就显然不是这个意思。
printf("%d %d\n",(num=100,1),num);这坨里面,本来分号之前按postfix-expression来看,里面的逗号是argument-expression-list的组成部分——用于分隔作为参数assignment-expression的硬编码的分隔符而不是逗号操作符,但这里硬加了个括号,而作为argument的assignment-expression当然没法包括没配对的括号,语法分析就只能把(num=100,1)当作整个assignment-expression,然后继续规约:conditional-expression→...→primary-expression→( expression )→expression , assignment-expression——这里面的逗号就是逗号操作符了。
这里的要点是语法规则决定了assignment-expression的逗号不会被作为操作符,而加上括号以后括号里面的东西可以不是assignment-expression而是允许包含逗号操作符的一般expression,因此加上括号以后含义就变了。
2015-06-06 14:22:32 +08:00
回复了 durami 创建的主题 C c/c++的算法及数据结构的书求推荐
@lijianying10 为什么关于C/C++算法,就需要参考侧重性能的具体实现呢?不管是不是初学者,如果根本没机会erformance tuning,研究这些材料投入和产出是不是会坑读者呢。即便是有这些需要,看这些之前,是不是先了解一些常见编译器选项和意义更实用呢?
2015-06-06 14:16:52 +08:00
回复了 professorz 创建的主题 程序员 写代码花括号不另起一行的好处是什么
@nilbot 对,这茬我倒给漏了。
嘛,一直觉得Ken这伙人taste奇葩倒罢了,还特么喜欢硬把自己的习惯加诸给用户。照抄保留下来的东西也经常贻害不浅,比如lvalue照样直接写进文法里而不是语义规则里搞得后面C(仍然是因为习惯而不便改动设计)还要返工,加上const里外不是人得刻意强调"modified" lvalue,还间接导致C++里面乱七八糟的value category的破事。

@lzjun C++14都正式版半年了……原版是Scheme么。

@MrGba2z Google的那啥C++规范,从目的(规范语用)来看内容写得极其外行,虽然其中有部分问题的辩解说是为了迁就小白用户和旧代码。(既然如此要你规范何用?)如果是写C++,在换行不换行以外的问题上强烈不建议参考。
2015-06-04 20:25:31 +08:00
回复了 professorz 创建的主题 程序员 写代码花括号不另起一行的好处是什么
@lilydjwg 好吧,漏了,\)的前面得是(for|while|if).+。我也不用单行块也不接受自己乱加;,所以没这类问题。
另外-Wall应该还是基于语义的,如果循环条件带副作用可能靠不住。

倒三角的评论应该分开回复……
GNU风格的最明显问题在于,它让制表符宽度一旦不是特定的一些预设值看起来就很糟糕,还不如都空格算了。

@chisj 都是习惯没错,但硬要说成一回事,“并没有什么好处”,不符合事实。
另起一行在习惯以外的好处,上面至少已经有人说了两个:人肉匹配块的边界更快;临时注释if等方便。(不管时常进行这些操作是不是习惯,对习惯或不习惯的用户来说效果应该都是类似的。)
而不另起一行的好处,也有提到了两个:节约行数;避免手贱错误地插入分号之类。
但是我已经指出过后者的这些理由很不一样:节约行数很不彻底,明显不如}}}};即使能减少一些具有良好编码习惯的用户很少发生的输入错误,也远不如另外进行语法检查靠谱。
所以我仍然好奇习惯以外到底有什么决定性优点。
2015-06-04 04:56:57 +08:00
回复了 professorz 创建的主题 程序员 写代码花括号不另起一行的好处是什么
@lilydjwg 这种错误怎么看也没比自作主张脑补;的语言来得混乱。既然后者都能接受,前者又有啥大不了的呢。
真不爽的怕错的,直接禁止然后源码里正则暴搜干掉所有\);(?=\r?$)得了。这种检查还方便自动化实现。

倒三角形美观?完全不明觉厉。先看长的代码再看短的代码心情会好么。至少汉字的文章按这种构造写看起来挺奇怪的。
2015-06-04 04:48:02 +08:00
回复了 professorz 创建的主题 程序员 写代码花括号不另起一行的好处是什么
想要省空间省回车的,干脆就用没括号的算了。(虽然一写在纸上换页然后就容易呵呵了。)
要是不爽这坨,用Lisp风格不就行了,这不更节约行数么。
说到底凭什么}非得吊车尾而{就不行呢?完全没理性的理由,只是习惯罢了。基于}经常占据了单独的行这个现实,说节约行数是主要目的的,我很怀疑有没有花时间想过这里的问题。
另外,K&R也不是照搬的理由。注意一下K&R C函数体内部的块的{}和其它{}还不都一样,显然并不是任何时候都把{前的换行删除。另外值得一提的是,函数体层次上和内部块的{}风格不一样和函数体必须是复合语句这些artifacts现在看来都是K&R C旧参数声明语法的遗毒。
2015-06-04 04:33:44 +08:00
回复了 hayeah 创建的主题 程序员 [思客教学]码农也能做出逼格破表的设计?抱团学设计
“我是个写了 10 年代码的码农,从来没有做过设计”
——你家的API spec是用膝盖糊出来还是天上掉下来的嘛?
平面设计?UI设计?工业设计?只是这些特例就想涵盖,也是醉了。
2015-06-04 04:22:14 +08:00
回复了 codegeek 创建的主题 程序员 技术总监还要用 svn,大家怎么看?
@mathgl 就算接口设计清楚点了,照样破事一堆。
比如Windows下Mercurial折腾exec bit,呵呵……都几年了才终于出来个官方workaround。
http://bz.selenic.com/show_bug.cgi?id=2020
另外基本实现不一样(revlog v. reflog),性能和可用性也不好说,得看日常哪些操作更多。
2015-05-15 17:51:27 +08:00
回复了 zaishanfeng 创建的主题 程序员 对于国人的开源项目,你敢用吗?
反正自己造的自己有数。
别人的先看看能不能抄,不方便抄的大多数情况也就说明不顶用了。
2015-05-14 00:10:00 +08:00
回复了 noli 创建的主题 程序员 我为什么后来远离了 Java
@monsabre1
Swift大概还是包括了一些好的设计的,一棍子打死太早了点(即便vendor-specific我不看好市场,又不像Haskell之类的特别能让人开眼值得多说几句)。
不过虽然Chris Lattner写编译器是高材生,一些人为设计和策略上的taste我也不赞赏。比如刻意曲意逢迎现有类C语言用户把特性命名搞乱,显得殊为不智: http://www.reddit.com/r/programming/comments/35kq2p/the_power_of_swift_enums/
——这反倒使新用户更加难以全面了解特性了。
2015-05-13 23:39:57 +08:00
回复了 noli 创建的主题 程序员 我为什么后来远离了 Java
@noli

这里的“工具”,如果指的是抽象的“手段”,那么几乎就是废话——差不多什么东西都能当工具。
如果是具体的“器具”,那也不合适,这个之前已经提过。
于是“语言就是工具”论,我就当是民科理论。从建设性来说鼓吹这种论调的还不如李煌老湿,后者好歹能有些娱乐价值。

破事有很多,再提些影响较大的。

首当其冲,想当然和惯性。
绝大多数人学习语言的目的往往是“会用”。这没问题。问题在于,不知不觉有些人就不考虑前提以为处处“存在就是合理”了,而不是联系实际需求,想想到底其中能有多少是有意为之的,哪些又是对现实的妥协。
比如说,越接近自然语言的设计就一定更“易用”吗?
比如说,越接近底层的,抽象特性越贫乏的语言,实现起来性能就一定能更好吗?
比如说,写出来的代码看起来干净,把类型都写清楚,没那么多乱七八糟的符号,就一定是更“清晰”吗?
只是不求甚解也罢了,然而这些问题实在太容易自以为是了。
这种思路这带来了严重的副作用,例如,阻碍现有语言的一些改进。
举个Java的例子。
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4459053
十多年前就有人提议过,结果呢……呵呵呵。
有些时候,语言的设计者自己就不够清楚,导致犯下的低级错误影响更坏——特别地,被无知者捧臭脚。
不过好在大多数语言设计者还是相对理性一些……于是结果就是蠢主意扎堆在少数的语言上了,这种语言的用户就是冤大头(虽然也有部分是活该)。
仍然是Java的例子。前无古人后无来者的checked exception,别的语言有好意思抄的么。
(嘛,据说James Gosling还想取消extends呢。林林总总加起来,说是偏执狂也不算冤枉吧。)

然后,如果一句“那么多的共同思想”就能轻描淡写把某些人打发走,那也太便宜了。
这方面仍然缺乏一些系统化的理论。有很多东西就是因为各种原因鸡同鸭讲,因此有时被逼不得不讨论清楚以免误会。
比如,“强类型”和“弱类型”这种普遍没有清晰边界的东西,不围绕具体例子是几乎没法保证知道别人说的是啥的。
再如,都说面向对象,那么是不是都怀疑过为什么“对象”里非要窜出个“类”呢?
其实照OO之父的观点,根本就不是那么回事——重点是对象和消息传递,方法乃至类都是实现方式,顶多这种只能算一种风格(class-based OO)。具体点说,应该是Simula→C with Classes→中古C++→Java等等这样传承下来的。
现实却是似乎有不少见识拙计的,就拿这个偷换概念了,却不知道所谓的prototyping也能毫不含糊地实现OO,反过来鼓吹卖弄什么pure OO,甚至还有什么“继承”“封装”“多态”都好意思拿来当OO的定义了……笑死人。(……敢区分OOP和OOAD么?)
这种可笑的误会如果非要说客观因素的话,恐怕就是缺乏交流导致的——严格意义上的“面向对象”这个概念因为这般鸡同鸭讲,和被废了差不多。
扯到这里倒是正好发现还能发散一些东西(虽然可能在c2.com之类的地方都已经吐槽腻的常识)来黑:无论是继承封装多态,还是SOLID这些所谓OO五原则,其实就没一个是OO的专利。
只挑其中和PLT最相关的两个来讲。
一是继承,在这些实现方式里面都是作为类型之间的关系,说白了就是一种subtyping,是一种类型之间的严格偏序关系的特例。摊上五原则里表面上最依赖“OO思想”的LSP,在System F里早就玩的溜了: http://typeof.net/2014/m/formation-of-modern-magic--why-functions-are-contravariant-in-the-input-type.html
二是多态。OO所谓的多态也就是inclusion polymorphism或者subtyping polymorphism,只是真正的多态中出现较晚的一种而已。出现早的呢?比如重载就是一种ad-hoc polymorpism。泛型则是parametric polymorphism。
大概那些OO语言的设计者对历史也不甚了然,不知道那么些别人早就玩滥的道道,所以就偷懒没明确(这里得承认C++当初也做得不好)。
于是只会照搬语言教科书以及盲目崇拜的无能者/纯OO厨就只能念歪经了。没法指望他们会创造更方便的能解决问题的设计,反而还得负担科普成本,这凭什么要我干呢?

嗯,要搞这坨又没特定目标用户(脑残粉也算),做好我不入地狱谁入地狱的思想准备。
1 ... 80  81  82  83  84  85  86  87  88  89 ... 92  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5574 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 43ms · UTC 09:21 · PVG 17:21 · LAX 02:21 · JFK 05:21
Developed with CodeLauncher
♥ Do have faith in what you're doing.