04 | 编译阶段能做什么:属性和静态断言
该思维导图由 AI 生成,仅供参考
编译阶段编程
- 深入了解
- 翻译
- 解释
- 总结
编译阶段的C++程序开发技巧 编译阶段是C++程序生命周期中至关重要的一部分,本文介绍了在这个阶段可以使用的两个技巧:属性和静态断言。属性是C++11引入的新特性,通过给变量、函数、类等“贴”上一个编译阶段的“标签”,方便编译器识别处理。静态断言是在编译阶段对代码进行断言检查,用于检测代码中的一些静态条件。这两个技巧可以帮助程序员在编译阶段发现问题、优化代码,提高程序的性能和可维护性。静态断言可以在编译阶段定义各种前置条件,充分利用C++静态类型语言的优势,避免把隐患带到运行阶段。文章还提到了一些实际应用场景,以及如何配合标准库里的“type_traits”来更好地发挥静态断言的威力。总的来说,编译阶段不仅仅是将源码翻译成机器码,还可以通过属性和静态断言等技巧,让程序员能够在编译阶段发现问题、优化代码,提高程序的性能和可维护性。
《罗剑锋的 C++ 实战笔记》,新⼈⾸单¥59
全部留言(30)
- 最新
- 精选
- Luca1. 因为属性标签都在编译器里内置,自定义的属性标签编译器无法识别。 2. 静态断言可以作为编译期的一种约定,配合错误提示能够更快发现编译期的错误。
作者回复: very nice。
2020-05-1433 - yelin斐布那契还可以这么玩,期待老师后面对于模版类的课程,我可能从来没都没学会过
作者回复: 模板元编程比较复杂,属于屠龙之术,这次我先不讲,如果感兴趣的同学多可以以后单独开一个课程。
2020-05-14531 - 逸清老师,自己C++基础知识还算了解,但代码写的太少,拿到一个需求无从下手,老师有没有比较好的方法或者适合练手的项目推荐?
作者回复: 建议先学习一下标准库,了解里面的那些工具,现在开发很少有白手起家的了,用好工具,知道它们能解决哪些问题,写应用也就比较容易了。 比如string/regex处理字符串、map/set集合、线程库等等,跟着课程逐步学吧。
2020-05-1416 - eletarior看到老师的斐波那契数列实现,我还是挺惊讶的,代码虽都看得懂,但是从没想过这么写,我有两个问题想请教下: 1.按本节的主题,编译阶段能做什么,所以说后面的那几个斐波那契数列在编译器就有结果了吗?如果是这样的话,肯定是需要cpu压栈计算的,这和真实的运行期有哪些不同呢?2.模板编程在哪些场景下使用比较好?模板编程 和 编译 阶段 似乎关联更大些
作者回复: 1.是的,这些代码都是模板类,自然会由编译器去解析处理,最后出来的也是编译期数值,也就是静态常量,省去了运行期的技术成本,运行期直接用就行。 2.模板元编程和预处理编程有点像,由编译器来改变源码的形态,但它的规则更复杂,难以理解,你首先要了解泛型编程,之后才能尝试模板元编程。 对于80%的C++程序员来说,我不建议尝试模板元编程,可以参考第1讲。
2020-05-1411 - jxon-H第三次学习这节课的内容,感觉自己总算明白了罗老师的苦心。 与一般的C++课不同,罗老师完全不讲语法要素这些百度一大把,而是从工作的原理和本质去剖析C++。 我记得开课的第一讲,罗老师就这么说过,当时没啥体会,现在越发觉得这样的编排确实很高级。 虽然对于我这种没怎么用过C++的人来说,接受所有信息有点吃力,但反而使我开阔视野,学习C++的时候,不会被限制语法语义的规则上,你还可以和预处理器、编译器打交道,让你的代码更好的让人和机器读懂。 什么场景应该和预处理器沟通一下,什么时候和编译器沟通一下,这些都是高级的编程技巧。这些沟通也许是非必要的,但是掌握这些沟通技巧,在编程的时候将如鱼得水。 对C++的钻研还不够深,功力不够,没发对老师的思考题发表有营养的见解,就这么表达一下自己的感受吧。
作者回复: 有点过誉了,受之有愧。 因为C++比较复杂,所以我划出了四个生命周期,方便特性的归类和理解,不然混在一起很容易把思路弄乱。 C++需要在实践中学,要花的时间和精力还是挺多的,不过乐趣也自在其中。
2020-05-2010 - EncodedStar老师可以在每讲开始讲讲上一讲提到的问题吗?很多疑惑~ 用“静态断言”,是不是在代码严格要求是32位系统或者64位系统的时候也比较有用呢?32位系统和64位系统本身有的类型所占字节数不同。
作者回复: 1.课程都是预先录好的,所以不能及时回答,有问题写在留言里,我可以回复,还是希望自己思考得到答案。 2.静态断言的用处很多,判断32/64只是个最简单的例子,只要能够在编译阶段计算出的结果就可以断言,不过这就需要对编译阶段有比较多的认识了。 不用着急,慢慢学C++,了解了泛型后再看静态断言可能就会好懂一些。
2020-05-193 - tt受语言的限制,编译阶段编程就只能“魔改”那些传统的语法要素了:把类当成函数,把模板参数当成函数参数,把“::”当成 return 返回值。 这个说法真形象,那些乱七八糟的语法一下就不面目可憎了。
作者回复: 嗯,这也是我反复思考才得出的经验。
2020-05-153 - EncodedStar预处理可以自定义是直接将定义好的内容写到源码里,而标签不能自定义是因为编译器需要识别标签名
作者回复: good
2020-05-1822 - 牙医模版元编程,劝退多少c++码农啊
作者回复: 模板元编程比较复杂,不会也没关系,用面向对象+泛型也可以写得很开心。
2020-05-142 - Carlos不得不说这节课让我回忆起了自己刚学会 vim macros 的感觉: 原来是我的想象力限制了 vim... 现在我想说: 原来是我的想象力限制了 c++...🧠 今天两个问题我都不是很懂, 希望老师指正. 1. 预处理阶段就是简单的文字替换, 编译阶段的属性标签应该需要编译器对这个标签进行 "一系列" 的配合, 过于复杂, 自己写容易翻车. 2. 要写简洁易懂的备注, 告诉别人为什么我要在这里终止编译对你进行提醒.
作者回复: 1.回答沾点边。实际上是因为属性标签必须要由编译器解释,而自定义标签编译器是不认识的,所以只能等编译器开发者去加,而不能是自己加。 2.说的比较好。 静态断言是一种对编译环境的“前提”“假设”,要求在编译阶段必须如何如何,可以结合第1讲的生命周期,考虑一下应该如何发挥它的作用。
2020-05-142