0%

Lambda表达式(Lambda)是C++编程中的游戏规则改变者。这有点令人惊讶,因为它们并没有给语言带来新的表达能力。Lambda所能做的所有事情都是您可以手动完成的,只需再多输入一点即可。但是用Lambda来创建函数对象实在是太方便了,这对日常C++软件开发的影响是巨大的。STL“_if”算法(例如,std::find_ifstd::remove_ifstd::count_if等),比较函数(例如,std::sortstd::nth_elementstd::lower_bound等)用Lambda作参数毫无压力。在STL之外,Lambda使快速创建std::unique_ptrstd::shared_ptr的自定义删除器成为可能,并且它们也能使线程API中条件变量简单明了。除了标准库之外,Lambda还为一次性调用的回调函数、接口适应函数和上下文相关函数的动态规范提供了便利。Lambda确实使c++成为一种更令人愉快的编程语言。

阅读全文 »

当你第一次了解到Move语义和完美转发的时候,它们看起来非常直观:

  • Move语义使编译器有可能用廉价的Move操作来代替昂贵的复制操作。正如复制构造函数和复制赋值操作符给了你赋值对象的权利一样,Move构造函数和Move赋值操作符也给了控制Move语义的权利。Move语义也允许创建(move-only)的类型,例如std::unique_ptr, std::future 和 std::thread。
  • 完美转发使接收任意数量参数的函数模板成为可能,它可以将参数转发到其他的函数,使目标函数接收到的参数与被传递给转发函数的参数保持一致。

右值引用是连接这两个截然不同的概念的胶合剂。它隐藏在语言机制之下,使移动语义和完美转发变得可能。

阅读全文 »

智能指针包裹原始指针,它们的行为看起来像被包裹的原始指针,但避免了原始指针的很多陷阱。你应该更倾向于用智能指针而非原始指针。几乎原始指针能做的所有事情智能指针都能做,而且出错的机会更少。

各种智能指针的API有极大的不同。唯一功能性相似的可能就是默认构造函数。因为有很多关于这些API的详细手册,所以我将只关注那些API概览没有提及的内容,比如值得注意的使用场景,运行时性能分析

阅读全文 »

说起知名的特性,C++11/14有一大堆可以吹的东西,auto,智能指针,移动语意,lambda,并发——每个都是如此的重要,这章将覆盖这些内容。 精通这些特性是必要的,但是成为高效率的现代C++程序员也要求一系列小步骤。 从C++98移步C++11/14遇到的每个细节问题都会在本章得到答复。 应该在创建对象时用{}而不是()吗?为什么alias声明比typedef好?constexpr和const有什么不同?常量成员函数和线程安全有什么关系?这个列表越列越多。 这章将会逐个回答这些问题。

阅读全文 »

从概念上来说,auto简单明了,但是它比看起来要微妙一些。

当然,使用它可以节省输入,也可以防止困扰手动类型声明的正确性和性能问题。

但从一个程序员的角度来看,auto的一些类型推断结果,虽然忠实地遵守了规定的算法,但却是错误的。在这种情况下,知道auto推导的结果是很重要的。

阅读全文 »

C++98有一组用于类型推断的规则: 用于函数模板的规则。C++11对这个规则集进行了一些修改,并添加了两个新的规则集,一个用于auto,另一个用于decltype。然后C++14扩展了autodecltype可能被使用的上下文。类型推断的使用场合越来越广,这使您不再需要手写那些明显或冗余的类型。它使C++代码的适应性更强,因为在源代码中的某一点更改类型会自动通过类型推断传播到其他位置。但是,它会使代码更难于推理,因为编译器推导出的类型可能和您希望的不同。

如果对于类型推导操作没有一个扎实的理解,要想写出有现代感的C++程序是不可能的。类型推导随处可见:在函数模板调用中,在auto出现的地方,在decltype表达式出现的地方,以及C++14decltype(auto)中。

阅读全文 »

前一篇记录了ECB编码,这篇用GCB编码,区别比想象的大一点。下面是各语言AES/GCM/128的加解密代码,经测试互相之间可通用。供参考(注意CTRL+C的话key变量不要忘了改)

Java把加密数据与TAG连接在一起作为GCM密文,所以为了互相通信,其它语言实现也按这种方式组合。

阅读全文 »

现在的软件没个前端后端移动端桌面端都不好意思拿出手。

不同平台之间通信时会遇到同样的数据同样的加密算法,Java、JS、C++、.Net算出来的不一样的抓狂情形。都知道肯定是各加密库的默认算法配置造成的差异,然而咱也不是加密算法专家,各种原理也是越看越晕,还是写代码试验最省心。

下面是各语言AES/ECB/128的加解密代码,经测试互相之间可通用。供参考(注意CTRL+C的话key变量不要忘了改)

阅读全文 »

VS Code越来越好用了,CMake和C++的支持都很完善。下面的文字记录了怎样用VS Code来作为IDE写C++ Qt项目的代码。

阅读全文 »

更新:新版VC-LTL已经可以更简单的实现了,下面的文章仅供纪念~~!不要浪费时间阅读了!不要浪费时间阅读了!

如果你从搜索引擎找到这里,说明你已经知道VC-LTL是什么了。请直接跳到第二节看脚本。

用VC动态编译以后的软件都需要带VC运行时库。如果客户机器上没装这个运行时库就会跳出错误框说“应用程序配置不正确,程序未能启动”云云。更烦人的是每种VC版本的运行时库还不一样,网上搜vcredist能列出从VS2003到VS2017的一堆版本,而且还在不断增加中…

所以很多人编译软件时都喜欢用静态编译,不过静态编译生成的文件比较大。一直以来我们都只能忍受编译出的软件个头大这个事实,直到我找到了VC-LTL。

阅读全文 »