对于非模板类型参数而言,使用auto进行自动推断会方便很多 template<auto param> auto是可选项而不是必选项 •对于部分情景而言,使用auto能够避免不少低级错误,如Effective Modern C++中提到的std::vector<int>::size_type和std::unordered_map中的键值对例如std::pair<const std::string, int>•但是过量使用 // ... authAndAccess(d, 5) = 10; std::deque<int>::operator[]的重载将会返回int&,但是由于使用模板类型推导,返回值的类型将会是int,而在C+ 在拓展typedef的同时也让C++的C++味儿更浓了 typedef int Status; using Status = int; 回归主题,在一些十分复杂的名称面前,我们会选择取别名,比如 typedef const对象,但并非所有的const对象都是constexpr对象 // 都要求编译期常量 int arr[10]; std::array<int, 5> arr; constexpr的泛用性在每代C+
Prefer nullptr to 0 and NULL C++会在需要指针的地方把0解释成指针,但是需要策略还是把0解释成int型 C++98中上面这种做法会使得在指针和int型重载共存时产生意外匹配调用 typename MyAllocList<T>::type list; ... }; MyAllocList<T>::type指的是一个取决于模板类型参数T的类型,因此就是一个依赖类型,C+ < 14.5 ){ // valid auto factors = primeFactors(static_cast<std::size_t>(c)); // valid ... } C+ ,所以成员函数和友元函数都不能使用已经删除的函数,否则会编译失败,这在C++98中会推迟到链接阶段才会报错 删除的函数是pulic而不是private,因为当客户端代码试图使用这个删除的成员函数时,C+ the most widely usable initialization syntax, it prevents narrowing conversions, and it's immune to C+
本文思维导图 一、方法论 作为写了十多年 C++ 的过来人,我想说的是,会写 C++ 是一回事,写好 C++ 则是另外一回事。 可用于工程实践的 C++ 书(例如如何结合 C++ 语言特性设计出优雅而鲁棒的 C++ API、如何优雅地组织和管理一个大型 C++ 工程等)推荐《C++ API 设计》《大规模 C++ 程序设计》。 所谓现代 C++(即所谓的 Modern C++)指的是 C++11 及之后的版本,目前最新版本是 C++20,这期间一共有 C++11、C++14、C++17 三个版本。 关于C++ Modern 智能指针可以参考这里《Modern C++ 智能指针详解》。 + 系列的作者 Scott Meyers 又写了本介绍现代 C++ 各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下: 五、常用编译器对 C++11/14/17
Tags: c++ Note:为避免各种侵权问题,本文并没有复制原书任意文字(代码除外,作者已经声明代码可以被使用)。需要原书完整中文翻译的读者请等待官方译本的发布。 在modern c++中,把这个东西废掉了,并加入noexcept关键字。从而只需要声明一个函数是否抛出异常即可。 noexcept的威力在于,它告诉编译器的优化器可以多大程度地优化函数代码生成。 在modern c++中,用户定义的析构函数亦或是编译器生成的析构函数,都隐式声明了noexcept。 条款16: 关于编译器自动生成的成员函数 移动构造函数(move constructor)和移动赋值操作符(move assignment operator),是modern c++新补充的generated
/*********************************************************** 关于书: 书是我从网上找到的effective Modern C++的样章,内容只到条款 1021842556@qq.com effective Modern C++的样章的下载地址http://pan.baidu.com/s/1ntKBlpf 提取密码是upkw 关于我: 一名大四的学生, C++的面貌,更不用说新增加的并发的特性。 +14,如果我只是简单的提到C++,那么它是属于所有语言版本的,因此,我可能会说C++是十分重视效率的(这里指的是所有的C++版本),C++98缺少对并发性的支持(指的仅仅是C++98),C++11支持了 如何你发现了任何形式的错误(技术的,解释说明的,文法的,排版的等等),或者你有关于改进这本书的建议,请给我发邮件,我的邮箱是emc++@aristeia.com,新的印刷给我机会来修订Effective Modern
一直以来,C++中基于值语义的拷贝和赋值严重影响了程序性能。尤其是对于资源密集型对象,如果进行大量的拷贝,势必会对程序性能造成很大的影响。 C++的内置类型(bool/int/double/char)都是值语义,标准库里的complex<> 、pair<>、vector<>、map<>、string等等类型也都是值语意,拷贝之后就与原对象脱离关系 C++中基于值语义的拷贝构造和赋值拷贝,会招致对资源密集型对象不必要拷贝,大量的拷贝很可能成为程序的性能瓶颈。 左值、右值 关于左值、右值,我们在之前的文章中已经有过详细的分享,有兴趣的同学可以移步【Modern C++】深入理解左值、右值,在本节,我们简单介绍下左值和右值的概念,以方便理解下面的内容。 移动语义 移动语义是Howard Hinnant在2002年向C++标准委员会提议的,引用其在移动语义提案上的一句话: 移动语义不是试图取代复制语义,也不是以任何方式破坏它。
引言 C++的<algorithm>提供了一系列通用的算法,这些算法可以与各种容器(如vector、list、array等)以及其他可迭代的数据结构一起使用。 C++ 17 标准引入了三个新的执行策略,并在 C++20 中引入了一个策略。C++ 中的这些执行策略允许根据任务的要求和可用的硬件以不同的方式执行算法。 C++的执行策略是一种编程模式,它允许开发者指定如何执行特定的操作或算法,而不必关心底层的实现细节。 总结 在C++中,选择std::execution的四种策略(seq、par、par_unseq和unseq)取决于你的应用场景、数据特性以及你希望算法执行的方式。 编译器支持: 不同的编译器对C++并行STL的支持程度不同。确保你的编译器支持你想要使用的策略。 性能测试: 在实际部署之前,进行性能测试来比较不同策略的性能。
个人觉得最核心的变化是右值引用的引入,右值引用是 C++ 走向现代化的最重要一步。建议每一位 C++ 开发者都应该深入去了解并充分使用它。 右值引用是 C++11 中最重要的新特性之一,它解决了 C++ 中大量的历史遗留问题,使 C++ 标准库的实现在多种场景下消除了不必要的额外开销(如 std::vector, std::string), 等等,这个 2B 解答听起来很耳熟,这不就是 C++ 中要移动一个对象时所做的事情吗? “移动”,这是一个三岁小孩都明白的概念。 所以,如果你要写出优雅的 Modern C++ 代码,应该多使用右值引用,喜欢它,拥抱它。 什么时候用 C 而不用 C++?》
作为C/C++开发人员,在平时的项目开发过程中,或多或少的听过左值和右值的概念,甚至在编译器报错的时候,遇到过lvalue和rvalue等字样;甚至使用过std::move(),但是不知道其含义。 作为多年的C++开发人员,一直以来,对左值右值的理解没有一个系统的认识,总感觉似懂非懂。 几种非左值的C表达式在C++中成为了左值表达式。 在C/C++中,表达式有很多种,我们常见的有前后缀表达式、条件运算符表达式等。字面值(literal)和变量(variable)是最简单的表达式,函数的返回值也被认为是表达式。 在C++中规定,右值引用是&&即由2个&表示,而左值引用是一个&表示。右值引用的作用是为了绑定右值。
// 正确 authenticateUser(); return c[i]; // 从c[i]推导返回类型 } 但是哪一种C+ ,但是对于authAndAccess函数,auto返回类型的推导将会去掉引用部分,因此产生的返回类型是int,作为函数的返回类型,int是一个右值,而上面的代码尝试把10赋给一个int类型的右值,这在C+ C++规则的制定者(The guardians of C++),预料到了在某种情况下类型推导需要使用decltype类型推导规则,所以在C++14中出现了decltype(auto)说明符,这个刚开始看起来可能会有些矛盾 这里有一个值得注意的地方,在 int x=0; x是一个变量的名字,所以decltype(x)的结果是int,但是将名字x用括号包裹起来,”(x)”产生了一个比名字更复杂的表达式,作为一个变量名,x是一个左值,C+
简而言之就是程序之中所有的操作都需要通过对象来完成。一切操作都要通过对象,也就是所谓的面向对象,在程序中对象被分成了两个部分数据和功能,以人为例,人的姓名、性别、年龄、身高等属于数据,人可以说话、走路、吃饭、睡觉这些都属于人的功能,数据在对象中被称为属性,而功能被称为方法,所以简而言之在程序中一切皆对象
Modern CSS Reset 我最近比较喜欢的一个 CSS Reset 方案,源自于 -- Modern-CSS-Reset。 Normalize.css 内的许多内容其实可能是一些实际中根本不会遇到或者用上的兼容适配,可以进行必要的精简 如果你的业务是全球化,面向的用户不仅仅在国内,你应该开始考虑更多可访问性相关的内容,上述的 Modern sanitize.css 提供一致的、跨浏览器的 HTML 元素默认样式以及有用的默认样式 4.8K reseter.css Normalize.css 和 CSS Reset 的未来替代方案 981 Modern-CSS-Reset
可以看出,在没有move拷贝之前, c++ 通过修改拷贝构造函数, 参数非const 达到这样结果。
轻微的修改了这些规则并且增加了两个,一个用于auto,一个用于decltype,接着C++14扩展了auto和decltype可以使用的语境,类型推导的普遍应用将程序员从必须拼写那些显然的,多余的类型的暴政中解放了出来,它使得C+ 想要在现代C++中进行有效率的编程,你必须对类型推导操作有一个扎实的了解,因为有太多的情形你会用到它,在函数模板的调用中,在auto出现的大多数场景中,在decltype表达式中,在C++14,神秘的decltype 明白模板类型推导 据说模仿是最诚恳的恭维之道,但是充满喜悦的无知也同样是可以衷心赞美的,当使用一个复杂的系统,忽视了它的系统是如何设计的,是如何工作的,然而对它的所完成的事情你依旧会感到很高兴,通过这种方式,C+ rs的引用性(reference-ness)在推导的过程中被忽略了,如果不是这样的话(例如,T被推导为const int&),param的类型将会是const int&&,一个引用的引用,引用的引用在C+ 但是这个数组的声明是被按照一个指针的声明而对待的,这意味着myFunc和下面的声明是等价的 void myFunc(int* param); // 和上面的函数是一样的 数组和指针在参数上的等价源于C+
电力电子器件、电路、拓扑及控制 脉宽调制 三角波载波比较法 增量调制法(滞环) Sigma-Delta调制法:该方法从参考信号中减去输出信号得到误差信号,对误差进行积分,当积分的误差值超过限制值时,输出信号的状态发生改变 空间矢量调制 电子市场上可以找到能够完成这些PWM控制方法的模拟集成电路,这些集成电路具有功耗低、元器件数量少的主要优点,但在系统配置上往往缺乏灵活性。许多数字电路 (如微控制器) 也能产生 PWM 信号。 通常采用一个周期增量计数器, 该计数器在每个 PWM 周期结束时复位, 当计数值达
本文来自NVIDIA GTC21的一次技术分享视频,演讲者是Sepp Hochreiter,主要讲述了他们关于Modern Hopfield Networks的相关工作,即论文:《Hopfield Networks 2016年,Hopfield与Krotov等人提出了一种新的深度学习范式:Modern Hopfield Networks,Demircigil等人在2017年对其进行了改进。 接下来,Hochreiter对Modern Hopfield Networks(MHNN)进行了阐述。
条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一样的,但是为什么会这样呢?模板的类型推导涉及了模板,函数和参数,但是auto的类型推导却没有涉及其中的任何一个。 这确实是对的,但这无关紧要,在auto类型推导和template之间存在一个直接的映射,可以逐字逐句的将一个转化为另外一个。 在条款1中,模板类型推导是以下面的模板形式进行举例讲解的: templa
本文编译自:https://jameskle.com/writes/open-source-data-stack-2021 2021 年一个有趣的新变化就是:Building the modern stack 如果是在国内玩大数据的人,可能对此还有些不太理解(比如我),现在各家互联网公司基于 Hadoop 生态圈等一系列开源组件构建的大数据平台解决方案早就已经成熟,那modern data stack价值在哪呢 现代数据栈 首先是modern data stack导致的一些变化: 从行式存储到列式存储:十年前,数据仓库大部分都是基于行式存储的 OLTP 数据库(例如 MySQL 或 PostgreSQL)构建的 Conclusively, open-source will continue to drive innovation on the modern data stack.
Modernwebdevelopment.png Modern web development, design and deployment can be effectively described web development' is, well, modern. Components of modern web development In this way, there are various center segments to modern web development web development modern. These components together portray modern web development.
不同的编译器提供的程度各有不同,例如:GNU和Clang编译器将x的类型表示为”i”,将y的类型表示为”PKI”,一旦你了解i意味着int,pk意味着pointer to Konst const(两个编译器都提供一个C+ 这些结果可能既不是十分有用也不是那么精确,所以明白C++的类型推导规则依旧很必要。