现代C++的内存模型和高性能的多线程编程
内存模型是现代C++语言标准里面的一个经常不太为人重视的特性;这种忽视大概是由于大部分的程序员关注的还是核心语言特性或者库设施这样的一些比较实用的“硬特性”。 相对而言,内存模型这样的底层的概念和机制看起来更像是给面向程序库编程的底层程序员用的。 然而如果我们想追求极致的应用程序性能,又想追求可移植性、高性能这...
内存模型是现代C++语言标准里面的一个经常不太为人重视的特性;这种忽视大概是由于大部分的程序员关注的还是核心语言特性或者库设施这样的一些比较实用的“硬特性”。 相对而言,内存模型这样的底层的概念和机制看起来更像是给面向程序库编程的底层程序员用的。 然而如果我们想追求极致的应用程序性能,又想追求可移植性、高性能这...
新的C++语言标准的演进越来越强调静态编译(即运行期计算)的优势,因为这一发展方向无疑更贴合现代的C++语言Zero Cost Abstraction的目标; 可惜这样做有个非常明显的副作用就是给编译器带来了巨大的挑战,乃至于稍微复杂一点的项目也动辄需要数个小时才能编译完成。
微服务架构模式是当今炙手可热的企业软件架构范式,经过最近几年的广泛的讨论和优缺点争辩之后已经随着 云原生架构 的逐渐火热而日益呈现星火燎原之势。 抛开这些争论不谈,假设我们需要实现一个微服务架构的服务,是否该用C++语言或者是否能用C++语言呢?
C++20的功能特性已经于3月份冻结,显然这次终于来了一波大的改进,而不再是像之前C++14/C++17那般小打小闹的做小步快跑,尤其是三个讨论很久的大feature终于被合入主干;并且这些feature终将会极大地影响后续C++代码的书写方式。
C++17 推出已经有将近3年的时间,速度快一些的公司才慢慢采纳了6年前的C++14进入正式的生产环境。 程序员们的一个大福利就是终于不用外挂第三方库(无论是准标准的boost还是其它形形色色的其它第三方库)就可以直接方便地使用标准库自带的<regex>来写代码; 这显然比直接使用原始而笨拙的stri...
C++标准的演进和推出速度过慢一直被内外社区批评,甚至当第一个21世纪的语言标准终于于2011年发布的时候,标准委员会的人都自嘲说我们是一门计算机语言,所以0x需要用十六进制数表示。 进入了第二个十年之后,社区的老学究们终于决定引入时髦的"发布火车"的模型,滚动地推出新的功能,之后新的语言标准总算按照一个大版本一...
9月份对于C++社区而言绝对是个令人振奋的收获季节。
很多C++项目中都存在一个能够异步调度任务的基础库;大部分这样的库都是用老的C++语言(98/03)写成的,要么模板元语法满天飞外加各种黑魔法导致维护困难, 要么是采用传统的宏方式导致维护困难,布满各种隐患。既然C++11/C++14提供了更好用的武器,我也耐不住手痒自己实现一个。
C++社区的第二届编程语言社区活动CppCon2015落下了帷幕;作为C++语言的发明人和灵魂人物, Stroustroup和Herb Sutter一起宣布他们正工作与一个基于现代C++核心语言的编程规范(Core Guidelines)并发布 在GitHub上,并立即引起了轰动。
lambda表达式(closure)是C++11中新引入的对程序组织构造改进最大的特性之一;这一特性并不是一个新的概念(几十年前的函数式于样都提供了该特性),然而对于一个深受过程式思维影响的语言而言,lambda的支持则极大提高了代码的抽象能力和可读性。
现有的C++03标准中,不必要的对象的拷贝和临时对象的构造经常会造成额外的性能开销(即使有返回值优化这样的编译器优化来帮忙也不能解决好多情况的问题);新的C++11标准通过对语言的修正,引入了RValue Reference和Move来解决这一问题。
C++11(C++0x)定稿已经满一年,主要的编译器这次跟进的速度也相当快,其中支持最好的要属最近声名雀起的llvm;作为一个历时8年之久的ISO标准,其诞生过程虽然过程很曲折,但是新标准对C++的改进和生产效率的提高无疑是大有益处的。
以前常用boost的一些库,由于项目自身用CMake组织build,跟着最新版本升级是很自然的想法。问题是,boost每次升级之后,重新用bjam编译一次都很是不便(某些平台,用默认选项编译有些问题,有时候往往安装不成功)。
以前尝试过在vim下配置STL的Intellisense曾经没有成功;最近有空刚好仔细看了下vim的一些相对高级的manual,总算将OmniCppComplete主页上的效果给弄了出来(这里)。
源码编译libcurl的时候,由于使用的不是默认系统上的ssl库(开发服务器上有很多个版本),为了避免动态库链接问题,必须定制SSL。 根据其源码里边的说明,只需要在./configure 后边加上 –with-ssl=即可。
Solaris上,常常可以用LD_PRELOAD辅助_mdb_做一些调试、测试工作,可以发现一些其它手段难以发现的问题;最近就遇到一个。
对于一个上点规模的C++项目而言,Log的作用是毋庸置疑的,出问题的时候,看了Log,常见的问题处理起来自是方便不过,即使遇到麻烦的问题,也可以从log总发现不少蛛丝马迹。因此一个严肃的项目应该从一开始就好好考虑如何打Log,便于分析、维护。