首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

闭关多日,整理一份C++中那些重要又容易忽视的细节

虚函数的工作原理 友元 了解一下友元函数吧 友元函数是否破坏了类的封装性 什么时候使用友元函数: ---- 基础篇 喜欢用内联函数吗?...有的人喜欢用内联函数,有的人不喜欢用,我嘛,无所谓,什么时候想起来就什么时候用,或者在代码审计的时候会去调整一部分函数为内联函数。...应有选择的使用内联函数,因为它节省下来的时间确实是少得可怜,如果说执行函数代码的时间比函数调用机制的时间长,那用内联函数就没什么意思。...数据项通常放在私有部分,组成类接口的成员函数放在公有部分。 为什么呢?这是C++的封装性。不然要类干什么?结构体不能用吗? 在后面讲设计模式的时候还会再细讲这一部分。...“用友”听说过吗?低代码听说过吗? 未来,这些前篇一律的基本代码,已经并不局限与本科生,专科生也可以做,甚至高中生都可以做。而某些本科生,还高人一等的姿态。

59410

Kotlin 源码里成吨的 noinline 和 crossinline 是干嘛的?看完这个视频你转头也写了一吨

刚才我说了,inline 关键字不止可以内联自己的内部代码,还可以内联自己内部的内部的代码,意思是什么呢,就是你的函数在被加了 inline 关键字之后,编译器在编译时不仅会把函数内联过来,而且会把它内部的函数类型的参数...所以,inline 是用来优化的吗?是,但你不能无脑使用它,你需要确定它可以带来优化再去用它,否则可能会变成负优化。...嗯……不过如果你们团队对于包大小有非常极致的追求,也可以选择酌情使用 inline,比如对代码做严格要求,只有会被频繁调用的高阶函数才使用 inline——这个可能在实施上会有点难度,一般来说,按我刚才说的原则就已经够了...是用来局部地、指向性地关掉函数的内联优化的。既然是优化,为什么要关掉?因为这种优化会导致函数中的函数类型的参数无法被当做对象使用,也就是说,这种优化会对 Kotlin 的功能做出一定程度的收窄。...Kotlin 的选择依然是霸气一刀切:内联函数里的函数类型的参数,不允许这种间接调用。 ? 解决了!解决不了问题,我就解决提出问题的人。 那我如果真的有这种需求呢?如果我真的需要间接调用,怎么办?

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】继承和多态高频面试题整理

    选择题 下面哪种面向对象的方法可以让你变得富有( ) A: 继承 B: 封装 C: 多态 D: 抽象 答案:A ( )是面向对象程序设计语言中的一种机制。...2.4 inline函数可以是虚函数吗? 这个问题之前没讲,我们来说一说。 内联函数可以是虚函数吗?大家想一想 我们先来回顾一下,什么是内联函数?...那这样来看,内联函数好像不能是虚函数。 但是: 内联函数一定会被当成内联处理吗? 是不是不一定啊。 因为内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。...2.5 静态成员可以是虚函数吗?...我们可能会觉得调普通函数快,因为调普通函数不需要像调虚函数那样还得通过虚指针去虚函数表里面找。 但是呢,这样说不准确,我问大家,调用虚函数一定要去虚表里面找吗?

    31410

    从 Java 的角度看待 Go 的内存管理| 青训营笔记

    其实,比起“妥协”,我认为这其实是一种“进步”。...因为这给予了开发者更多的选择权:对于普通 Go 开发者来说,他们完全可以不使用 arenas,享受 Go 垃圾回收器带给他们的欢愉;但是,对于对内存占用和性能有高要求,但是又不希望使用 C/C++ 进行开发的开发者来说...)和不包含指针的大块(noscan mspan)来有针对性地进行 GC。...Go 编译器优化 函数内联(Inlining)(小提一嘴,在 Kotlin 中,虽然其支持使用 inline 关键字主动内联函数/变量,但这是不被建议的,因为 JVM 会为需要内联的函数/变量自动内联,...手动内联其实并不能提升多大的效率,因此 inline 关键字只建议配合 refied T 泛型使用) Beast Mode 逃逸分析 引用 该文章部分内容来自于以下课程或网页: 字节内部课:高性能 Go

    53640

    复习python第五天

    函数的使用: 例如你要有一个取绝对值的函数,就有内置函数abs()给你调用 ? 当然你也可以用自己设计的函数去取绝对值,只有声明一个函数,并函数里面的逻辑弄对了,便可以直接调用了。...我这里的例子就只是很简单的把数字转换为字符串,再将符号替换掉而已,输出的结果估计也是str值,当然可以最后再转换为整型。 ?...圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以“:”冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。...虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。...变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下: 全局变量 局部变量 ?

    39830

    C++ 如何进行性能优化?

    选择合适的编译器和优化选项编译器选择:使用高性能的编译器,如 GCC、Clang 或 MSVC。优化选项:使用编译器的优化选项,如 -O2 或 -O3,这些选项可以显著提高代码的执行效率。...优化算法和数据结构算法选择:选择时间复杂度和空间复杂度更低的算法。...内联函数内联函数:使用 inline 关键字或 __attribute__((always_inline)) 属性来内联小函数,减少函数调用开销。...使用性能分析工具性能分析工具:使用性能分析工具(如 gprof、Valgrind、Intel VTune)来识别性能瓶颈,针对性地进行优化。gprof ....内联函数:使用内联函数减少调用开销。循环优化:手动展开循环,减少条件判断。并行化:利用多线程和 SIMD 指令。缓存优化:确保数据访问具有良好的局部性。避免过度抽象:减少虚函数调用,利用模板元编程。

    4200

    重学 Kotlin —— inline,包治百病的性能良药?

    目录 inline 的本质 建议我不要用 inline ? Java 支持内联吗? 拯救 Lambda Java 是如何优化 Lambda 的? 不想内联怎么办? 如何从 Lambda 返回?...这样就可以提高运行效率吗?如果可以,为什么? 我们先从 JVM 的方法执行机制说起。...Kotlin 的内联最好用在函数参数类型中。 不急着解释,首先来一发灵魂拷问。 Java 支持内联吗? 你可以说不支持,因为 Java 并没有提供类似 inline 的显示声明内联函数的方法。...所以,可以推断出,不管是 javac ,还是 kotlinc,在编译期是没有内联优化的。 至于 JVM 具体的内联优化机制,我了解的并不多,这里就不做过多介绍了。...但是有些时候我并不想直接退出外层函数,而是仅仅退出 Lambda 的运行,就可以这样写。

    85320

    Python学习-函数

    但你也可以自己创建函数,这被叫做用户自定义函数 使用函数: 1,可以降低代码量 2,降低维护成本 3,使程序更容易阅读 函数式编程最重要的是增强代码的重用性和可读性 你可以定义一个由自己想要功能的函数,...圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。...1、返回值 函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。 return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。...虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。...变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下: 全局变量 局部变量 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

    44830

    如何在 C++中进行高效的代码优化

    以下是一些在 C++ 中进行高效代码优化的常见方法: 使用合适的算法和数据结构:选择适合解决问题的算法和数据结构可以显著提高代码的效率。...可以通过使用静态数组、预分配内存池或对象池等技术来减少内存分配的次数。 减少函数调用的开销:函数调用会有一定的开销,包括参数传递、栈帧的创建和销毁等。...通过使用引用、移动语义或指针等技术,可以减少或避免多余的内存拷贝。 使用编译器优化选项:大多数编译器都提供了一些优化选项,可以帮助编译器生成更高效的代码。...C++ 11 引入了标准库的并行算法和线程库,可以方便地进行并行计算。 使用内联函数:将一些短小的函数声明为内联函数可以避免函数调用的开销,提高代码的效率。...可以使用 inline 关键字或编译器的自动内联功能来实现。 使用性能分析工具:使用性能分析工具来找出代码中的性能瓶颈和热点,可以有针对性地进行优化。

    11510

    Go语言中常见100问题-#97 Not relying on inlining

    在我的电脑上运行结果如下: go build -gcflags "-m=2" # inline ....上述代码内联后如下: func main() { a := 3 b := 2 s := a + b println(s) } 并不是任何函数都可以内联,内联只是对具有一定复杂性的函数有效,所以内联前要进行复杂性评估...例如,在函数被内联后,编译器可以决定最初应该在堆上逃逸的变量可以分配在栈上。 函数内联是编译器自动完成的,开发者有必要关心吗?需要关心,因为有中间栈内联。...中间栈内联是调用其他函数的内联函数,在Go1.9之前,只有叶子函数(不会调用其它函数的函数)才会被内联。现在由于支持栈中内联,所以下面的foo函数也可以被内联。...将简单逻辑处理和复杂逻辑处理区分开,如果简理逻辑处理可以被内联但是复杂逻辑处理不能被内联,我们可以将复杂处理部分提取到一个函数中,这样整体函数如果通过内联评估,在编译时就可以被内联处理。

    16110

    Python3急速入门(三)函数与lambda表达式、闭包

    圆括号之间可以用于定义参数 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明 函数内容以冒号起始,并且缩进 Return[expression]结束函数,选择性地返回一个值给调用方。...选择不多传参数也可: ? 所有参数(自变量)在Python里都是按引用传递。如果在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了 ?...return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None ? 内部函数。函数体内可以再定义函数: ?...二、函数变量作用域 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。...仅仅能在lambda表达式中封装有限的逻辑进去 lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数

    75350

    《C++代码高度优化之双刃剑:避免过度优化引发的“暗雷”》

    在进行优化之前,应该先进行性能分析,确定代码的瓶颈在哪里,然后有针对性地进行优化。 三、实用的优化技巧与注意事项 1. 选择合适的数据结构和算法 数据结构和算法的选择对代码的性能有很大的影响。...利用编译器的内联函数 内联函数可以减少函数调用的开销,提高代码的性能。在 C++中,可以使用 inline 关键字将函数声明为内联函数。...然而,过度使用内联函数也可能会导致代码体积增大,影响编译时间和可维护性。 因此,在使用内联函数时,要根据函数的大小和调用频率来决定是否进行内联。...对于小而频繁调用的函数,可以考虑使用内联函数;对于大而复杂的函数,最好不要进行内联。 4. 注意循环的优化 循环是程序中常见的结构,对循环的优化可以带来显著的性能提升。...同时,在进行优化时,要选择合适的数据结构和算法,避免不必要的内存分配和复制,利用编译器的内联函数,注意循环的优化等。只有这样,才能在追求高性能的同时,确保代码的正确性和稳定性。

    7110

    总结继承和多态的一些问题

    3.构造函可以是虚函数吗? 不行的,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。...而指针或者引用是直接指向派生类对象,不会进行拷贝赋值,这样虚函数表是派生类的虚函数表,故能实现多态。 5.inline函数可以是虚函数吗?...内联函数可以写成虚函数,不过写出虚函数后,这个内联函数就不是内联函数了。 6.静态成员可以是虚函数吗?...不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 7.析构函数可以虚函数吗? 基类的析构函数最好是虚函数。...另外,纯虚函数可以有函数实体,但是没必要。 抽象类的作用是强制重写虚函数。另外抽象类体现出了接口继承关系 大家如果还有什么问题需要补充的话可以评论告诉我哦!

    45720

    xv6 启动理论部分

    启动理论部分 本节来说说捋清启动需要知道的一些东西,因知识点的确很多,涉及了各个方面,我就不像其他章节一样各个部分前后有比较紧密的联系,而是直接以干货的形式罗列出来,这样或许更清晰些,不多说了来看 内存低...而分页的话,线性地址需要进一步转化为物理地址,线性地址是连续的,但是物理地址可以不连续。 这意味着可以在物理内存上随便(不是真随便,有块大小限制)找块地,只要线性地址和物理地址建立起映射关系就好。...平常正在运行的计算机我们可以使用 exec 族函数来加载运行一个程序,同样的要加载运行操作系统这个程序就使用 Bootloader。...启动是个大工程,涉及到方方面面,本文也没有全部覆盖,比如说加载内核的时候会涉及到磁盘读写,期间还会涉及到内联汇编的使用,内容较多我就不放在本文了,前面有相应的文章,感兴趣的看可以看看。...本文就这么多吧,启动是个很大的工程,涉及到各个方面,所以其实还有一些没说,比如可执行文件 elf 的格式,这部分见 ELF 文件格式,磁盘的读写操作见 磁盘操作,某些地方还涉及到内联汇编操作见后 内联汇编

    35500

    泛型会让你的 Go 代码运行变慢

    假设大家想创建一个多态函数,即能对不同事物执行模糊操作的函数。从广义上讲,能够选择的解决思路有两种。 第一种是让一切事物(也就是函数操作对象)保持统一的观感与行为模式。...我碰巧在 Vitess 上找到了一长串手动单态化的函数与实现。其中一部分重复函数是受到多态性所限而无法用接口建模;也有一部分重复函数是因为对性能至关重要,所以避免用接口编译能带来显著的性能提升。...问题在于:我们在 Go 里能实现相同的效果吗?或者说,能根据回调函数对函数进行参数化吗?虽然我能找到的一切泛型文档中都没提过,但答案仍然是肯定的。...从 Go 1.18 说明文档中关于完全单态化的风险来看,选择使用字典来实现泛型的理由,似乎是代码单态化的速度很慢。但这又带来了新问题:真的吗?既然从来就没有过 Go 代码单态化方案,怎么判断它很慢?...我总觉得这种复杂的技术权衡背后,是有某种顽固的误导性假设在作祟。这种假设在开发者脑袋里普遍存在,例如“单态 C++ 代码就很慢”。但还是那个问题:真的吗?

    1.1K20

    泛型会让你的 Go 代码运行变慢

    假设大家想创建一个多态函数,即能对不同事物执行模糊操作的函数。从广义上讲,能够选择的解决思路有两种。 第一种是让一切事物(也就是函数操作对象)保持统一的观感与行为模式。...我碰巧在 Vitess 上找到了一长串手动单态化的函数与实现。其中一部分重复函数是受到多态性所限而无法用接口建模;也有一部分重复函数是因为对性能至关重要,所以避免用接口编译能带来显著的性能提升。...问题在于:我们在 Go 里能实现相同的效果吗?或者说,能根据回调函数对函数进行参数化吗?虽然我能找到的一切泛型文档中都没提过,但答案仍然是肯定的。...从 Go 1.18 说明文档中关于完全单态化的风险来看,选择使用字典来实现泛型的理由,似乎是代码单态化的速度很慢。但这又带来了新问题:真的吗?既然从来就没有过 Go 代码单态化方案,怎么判断它很慢?...我总觉得这种复杂的技术权衡背后,是有某种顽固的误导性假设在作祟。这种假设在开发者脑袋里普遍存在,例如“单态 C++ 代码就很慢”。但还是那个问题:真的吗?

    1.2K40

    为什么泛型会让你的Go程序变慢

    至少,你可以去掉虚函数调用,摆脱虚拟表;在最好的情况下,你可以内联代码,这反过来又可以进一步优化,内联代码是很好的 对于系统编程语言来说,单态化是一个彻底的胜利:从本质上讲,它是唯一一种运行时开销为零的多态性形式...它为像 Go 一样的语言增加了很多表现力,在不引入新的语言语法和运行时开销的情况下,实现了迭代和其他功能结构 问题是:我们能在 Go 中做同样的事情吗?可以根据函数的回调来对其进行参数化吗?...如果我们的函数的回调不是对 generic shape 的回调,而是 func(rune) 回调的一个单态实例,这将允许 Go 编译器将整个调用扁平化。你明白我在说什么吗?...尽管 Go 编译器的复杂度不高,但很明显可以衡量的是,从 1.0 开始,它生成的代码在每个版本上都在稳步提高,很少有退步,一直到现在 通过阅读 Go 1.18 中完全单态化的原始提案中的风险部分,似乎选择用字典实现泛型是由于单态化代码很慢...我觉得这个复杂的技术选择背后有一个强有力的指导因素,那就是我们都持有的潜在的误导性假设,比如说 "单态化C++代码很慢"。这又提出了一个问题:是这样吗?

    34830

    【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

    1.2 内联函数的特性 内联函数是以inline修饰的函数,在调用其该函数的时候会直接在调用处展开并不会开辟函数的栈帧空间所以非常适用在一下短小函数上面: 下面就给大家来看一下使用内联函数的效果: 代码一...内联函数适合每个函数都用吗? 内联函数看起来不用开辟函数的栈帧空间大大结束了效率但是每个短小的函数都适合使用内联函数吗?...其实函数在调用次数过多的情况下就不适合使用内联函数,这样就会导致代码膨胀到处都是重复的代码,从而使得可执行程序变大; 还有在函数的递归时也不能使用内联函数,函数栈帧是可以复用的,但内联函数一旦使用也会导致代码膨胀...下图为 《C++prime》第五版关于inline的建议: 内联函数需要声明和定义分离吗? inline不建议声明和定义分离,分离会导致链接错误。...: 第一部分是范围内用于迭代的变量 第二部分则表示被迭代的范围。

    10300

    操作系统(4)实验0——准备知识、基本内联汇编、扩展内联汇编

    开发OS实验的简单步骤 gcc基本用法 此处忽略掉编译C部分,因为我懂且因为这是我的笔记(傲娇脸)。...indexscale) Intel: [basepointer + indexpointer × indexscale + imm32) 操作系统工作在保护模式下的时候用的是32位线性地址...为了解决这个问题,就要用到扩展 GCC 内联汇编语法。 GCC扩展内联汇编 这部分我除了看实验指导书之外还看了别人写的。...然后是输出部分,输出部分是必须有=的,=r代表目标操作数可以使用任何一个通用寄存器,并且变量b存放在这个寄存器中(或者这么说,这个寄存器与变量b相关联,先将操作数的值读入寄存器,用这个寄存器执行相应指令...另外,如果使用%数字的话,如%0,那么就是让gcc自己选择合适的寄存器,如果想要使用固定的寄存器,那么就要指定名字,例如%%eax。

    72920
    领券