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

没有必要导出只有虚拟/内联函数的类?

没有必要导出只有虚拟/内联函数的类。

这个问答内容涉及到C++编程语言中的类设计和函数特性。在C++中,类是一种用户定义的数据类型,它可以包含数据成员和成员函数。成员函数是与类相关联的函数,它们可以访问和操作类的数据成员。虚拟函数是一种特殊类型的成员函数,它允许子类重写它们的实现。内联函数是一种特殊类型的成员函数,它的调用被编译器替换为函数的实际代码,以提高程序的运行速度。

在这个问答内容中,提到了只包含虚拟/内联函数的类。这种类通常用于定义接口或基类,它们不包含任何数据成员,只提供虚拟/内联函数供其他类实现或重写。由于这些类不包含任何数据成员,因此它们不需要被导出。导出类通常是为了让其他模块或程序使用它们的数据成员和成员函数。

因此,没有必要导出只有虚拟/内联函数的类,因为它们的主要目的是为了提供接口和实现多态性,而不是用于数据存储和访问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

但是 JVM 是支持。Java 把内联优化交给虚拟机来进行,从而避免开发者滥用。 典型一种滥用, 内联超长方法 ,极大增大字节码长度,反而得不偿失。...因此,在 Kotlin 中,没有必要为普通函数使用内联,交给 JVM 就行了。...所以,上一节中 IDE 给开发者提示就很明了了。 JVM 已经提供了内联支持,所以没有必要在 Kotlin 中内联普通函数。 那么问题又来了。...对于普通函数没有必要使用内联,因为 JVM 已经提供了一定内联支持。 对指定 Lambda 参数使用 noinline ,可以避免该 Lambda 被内联。...除了内联函数之外,Kotlin 1.3 开始支持 inline class ,但这是一个实验性 API,需要手动开启编译器支持。不知道大家对内联有什么独特看法,欢迎在评论区交流。

74920
  • C++核心准则​讨论:将基析构函数设为公共和虚拟,或受保护和非虚拟

    Discussion: Make base class destructors public and virtual, or protected and non-virtual 讨论:将基析构函数设为公共和虚拟...析构函数应该是虚函数吗?也就是说,是否应该允许通过指向基指针进行销毁?如果是,则base析构函数必须是公共才能被调用,否则虚拟调用它会导致未定义行为。...否则,应该对其进行保护,以便只有派生才能在自己析构函数中调用它,这个析构函数也应该是非虚,因为它不需要虚拟地运行。...这种情况导致较早编码标准对所有基析构函数都必须是虚拟提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当基析构函数是公共时,才将它们虚函数化。...因此,如果可以调用(即是公共)基析构函数,则它是虚拟,否则是非虚拟

    1.1K20

    C++:04---内联函数

    缺点:浪费代码空间 4.使用内联情况 不宜使用内联情况:递归函数、或函数中含有循环结构(浪费时间)、或函数代码过长(消耗内存) 可使用内联情况:内联一般在中使用(函数内进行简单赋值、或直接返回数据...这个细节虽然不会影响函数功能,但是体现了高质量C++/C 程序设计风格一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。...当然内联函数定义也可以放在源文件中,但此时只有定义那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里定义必须是完全相同),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了...————《高质量程序设计指南——C++/C语言》 林锐 而在Google C++编码规范中则规定得更加明确和详细: 内联函数: Tip:只有函数只有 10 行甚至更少时才将其定义为内联函数....虚函数内联主要原因则是想把它函数体放在定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短存取函数.

    1.3K40

    编写高效Android代码

    通过接口引用来调用会花费2倍以上时间,相对于通过具体引用进行虚拟函数调用。 如果你选择使用一个HashMap,因为它更适合于你编程,那么使用Map会毫无价值。...(同样,publicAPI是一个例外,一个好API价值往往大于执行效率上那点损失) 使用静态优于使用虚拟 如果你没有必要去访问对象外部,那么使你方法成为静态方法。...它会被更快调用,因为它不需要一个虚拟函数导向表。这同时也是一个很好实践,因为它告诉你如何区分方法性质(signature),调用这个方法不会改变对象状态。...; 这个将不会调用es a ` 方法,因为这些常量直接写入了文件静态属性初始化中,这个初始化直接由虚拟机来处理。...doStuff”时,内联就会调用这些静态方法,这就意味着你不是直接访问成员,而是通过公共方法来访问

    60330

    《深入理解java虚拟机》学习笔记之编译优化技术

    对于这种表达式,没有必要花时间再对它进行计算,只需要直接用前面计算过表达式结果代替E就可以了。...无法内联原因是,只有使用invokespecial指令调用私有方法、 实例构造器、 父方法以及使用invokestatic指令进行调用静态方法才是在编译期进行解析,除了上述4种方法之外,其他...如果遇到虚方法,则会向CHA查询此方法在当前程序下是否有多个目标版本可供选择,如果查询结果只有一个版本,那也可以进行内联,不过这种内联就属于激进优化,需要预留一个“逃生门”(Guard条件不成立时Slow...如果程序后续执行过程中,虚拟机一直没有加载到会令这个方法接收者继 承关系发生变化,那这个内联优化代码就可以一直使用下去。...第五,Java语言中对象内存分配都是堆上进行只有方法中局部变量才能在栈上分配。

    45020

    CC++中inline用法详解

    这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序生命期中引起无意不匹配事情。...这个细节虽然不会影响函数功能,但是体现了高质量C++/C 程序设计风格一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。...定义在声明之中成员函数将自动地成为内联函数,例如 class A { public: void Foo(int x, int y) {  } // 自动地成为内联函数 } 将成员函数定义体放在声明之中虽然能带来书写上方便...构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构 函数可能会隐藏一些行为,如“偷偷地”执行了基或成员对象构造函数和析构函数。...假如内联函数是成员函数,对象地址(this)会被放在合适地方,这也是预处理器办不到。 C++ 语言函数内联机制既具备宏代码效率,又增加了安全性,而且可以自由操作数据成员。

    1.7K30

    为什么应该尽可能避免在静态构造函数中初始化静态字段?

    不同是Foo以内联(inline)赋值方法进行初始化,而Bar则将初始化操作定义在静态构造函数中。...从这个例子来说,由于整个应用并没有使用到Foo和Bar静态字段,所以针对它们初始化是没有必要。所以我们说以内联方式对静态字段进行初始化Foo具有更好性能。...如下所示两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo中没有显式定义静态构造函数,但是编译器会创建一个默认静态构造函数,针对静态字段初始化就放在这里。...,所以我们自行定义专门用来初始化静态字段静态构造函数是完全没有必要。...不但没有必要,还可能带来性能问题,应该改成以内联形式对静态字段进行初始化。

    18110

    Kotlin|这些隐藏内存陷阱,你应该熟记于心

    Hi, 你好,很高兴见到你 引言 Kotlin 是一个非常 yes 语言,从 null安全 ,支持 方法扩展 与 属性扩展,到 内联方法、内联 等,使用Kotlin变得越来越简单舒服。...导航 学完本篇,你将了解到以下内容: 密封构造函数传值使用细节; 内联函数,你应该注意地方; 伴生对象隐藏性能问题; lazy ,可能没你想那么简单; apply !...内联很好,但别太长 inline ,翻译过来为 内联 ,在 Kotlin 中,一般建议用于 高阶函数 中,目的是用来弥补其运行时 额外开销。...假设我们某个方法里代码只有两行(我想不会有人会某个方法只有一行吧),这个方法又被好几处调用,内联是提高了调用性能,毕竟节省了一次栈帧,再加上方法行数少(暂时抛弃虚拟机优化这个底层条件)。...总结如下: 因为内联函数会将方法函数移动到调用处,会增加调用处代码量,所以对于较长方法应该避免使用; 内联函数应该用于使用了 高阶函数(lambda) 方法,而不是普通方法。

    79630

    带你深入了解 Module

    模块介绍 当我们应用程序变大时,我们想要把它分割成多个文件,也就是所谓“模块”。一个模块可以包含一个用于特定目的函数库。 很长一段时间以来,JavaScript都没有语言级模块语法。...这不是问题,因为最初脚本很小很简单,所以没有必要。 但最终脚本变得越来越复杂,因此社区发明了各种方法来将代码组织到模块中,以及根据需要加载模块特殊库。...模块可以相互加载,并使用特殊指令导出和导入来交换功能,从一个模块调用另一个模块函数: export 关键字标签变量和函数,这些变量和函数应该可以从当前模块外部访问。...例如,如果我们有一个文件sayHi.js导出一个函数: // ? sayHi.js export function sayHi(user) { alert(`Hello, ${user}!...import指令通过相对于当前文件path ./sayHi.js加载模块,并将导出函数sayHi赋给相应变量。 让我们在浏览器中运行这个示例。

    1.1K20

    热修复Class流派和Dex流派实现原理

    最简单就是在构造函数里面进行访问跨dex即可,这样不在同一个dex就不会打标志 实现: 创建一个空放到一个独立dex上 在所有构造函数里面都去访问那个独立dex里面空,所有的都存在一个跨...正好要引用你补丁,而补丁之前在虚拟机优化时候满足内联条件,那么老方法已经被写到引用里面了。...在art虚拟机上你dex是需要编译成机器码以后才能被虚拟机加载和运行 dex2oat编译模式 编译过程有十几种模式,比较关心只有三种: interpret only:该模式在first boot或者...用户真正使用到可能只有很少部分,我们为什么要为了百分之二三十代码去做全量编译呢?...没有必要 N之前Art虚拟机上安装是做全量编译,所以安装时候会等很久,做Jit及时编译又会很慢 在N上解决了这个问题通过混合编译缩短安装时间,系统OAT升级更快: 安装和首次启动用intervept-only

    54930

    Android热更新方案Robust

    但经过调研之后,我们发现上述方案或多或少都有一些问题,基于native hook方案:需要针对dalvik虚拟机和art虚拟机做适配,需要考虑指令集兼容问题,需要native代码支持,兼容性上会有一定影响...只有一个可能,就是ProGuard内联受到了影响。使用了Robust插件后,原来能被ProGuard内联函数不能被内联了。...深入分析代码,我们发现确实如此,只被调用了一次私有函数只有一行函数函数(比如get、set函数等)都极可能内联。...其实仔细思考下,那些可能被内联只有一行函数函数,真的有被插件处理必要吗?...别说一行代码函数出问题可能性小,就算出问题了也可以通过patch内联那个函数来解决问题,或者patch这一行代码调用那个函数。只调用了一次函数其实是一样

    1.5K90

    Java 虚拟机:JVM是怎么实现invokedynamic?(下)

    为了支持调用任意 race 方法,我实现了一个简单单态内联缓存。如果调用者类型命中缓存中类型,便直接调用缓存中方法句柄,否则便更新缓存。...这个适配器实现了对应函数式接口,在我们例子中,也就是 IntUnaryOperator。启动方法返回值是一个 ConstantCallSite,其链接对象为一个返回适配器实例方法句柄。...你可以通过虚拟机参数 -Djdk.internal.lambda.dumpProxyClasses=/DUMP/PATH 导出这些具体适配器。...这里我导出了上面这个例子中两个 Lambda 表达式对应适配器。...只有这样,逃逸分析才能判定该适配器实例不逃逸。否则,我们会在运行过程中不停地生成适配器实例。所以,我们应当尽量使用非捕获 Lambda 表达式。

    2K30

    Sington(单例模式)

    一、使用Sington单例模式动机(Motivation) 在软件系统中,经常有一些特殊,必须保证它们只有一个实例,才能保证它逻辑正确性、以及良好效率。...大多数是常规构造器,所以往往能创建很多实例,那么如何绕过常规构造器,并且提供一种机制(设计模式)来保证一个只有一个实例。...二、使用Singtong(单例设计模式)意图 保证一个只有一个实例,并且提供一个该实例全局访问点 三、结构 ?...,就支持垃圾回收平台和对象来讲,这么点开销,一般没有必要对其进行特殊管理,除非这个超级大(但是如果这个如果很大的话,那这个需要重构). 5、不能应对多线程情况,如果在多线程环境下,下面的紧接着实例代码可能会创建出多个实例...,大多数情况下,数据初始化任务都会交给构造器函数 //但是这里我们使用内联初始化方式来实现单例模式,这种方式,创建实例会交给静态构造函数来实现 //而静态构造函数不能给他传递参数

    81170

    内联函数 c-浅谈内联函数与宏定义区别详解

    宏定义则不能;   4.在中声明同时定义成员函数,自动转化为内联函数。   ...2.内联函数使用:   所有在声明中定义函数将被自动认为是内联函数。   ...这个细节虽然不会影响函数功能,但是体现了高质量C++/C程序设计风格一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。   ...构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基或成员对象构造函数和析构函数。...每个只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它称为普通构造函数)。

    65740

    JVM性能优化系列-(6) 晚期编译优化

    Spot Detection):采用这个种方法虚拟机会为每个方法建立计数器,统计方法执行次数,如果执行次数超过一定阈值就认为它是“热点方法” 在HotSpot虚拟机中使用是第二种,因此它为每个方法准备了两计数器...E中所有变量值都没有发生变化,那么E这次出现就成为了公共子表达式 对于这种表达式,没有必要花时间再对它进行计算,只需要直接用前面计算过表达式结果替代E就可以了 如果这种优化仅限于程序基本块内,...但实际上java虚拟机中内联过程远远没有那么简单,因为java中方法大多数是虚方法,虚方法在编译期做内联时候根本无法确定应该使用哪个方法版本 对此java虚拟机设计团队想了很多办法,首先是引入了一种名为...编译器在进行内联: 非虚方法:直接进行内联,这时候内联是有稳定前提保障 虚方法:向CHA查询此方法只在当前程序下是否有多个目标版本可供选择 只有一个:可以进行内联,不过这种内联属于激进优化...如果程序后续执行过程中,虚拟机一直没有加载到会令这个方法接收者继承关系发生变化,那这个内联游湖代码就可以一直使用下去。

    24410

    Java 面试——即时编译( JIT )

    简介 当 JVM 初始化完成后,在调用执行过程中,执行引擎会把字节码转为机器码,然后在操作系统中才能执行。在字节码转换为机器码过程中,虚拟机中还存在着一道编译,那就是即时编译。...分层编译 在 Java7 之前,需要根据程序特性来选择对应 JIT,虚拟机默认采用解释器和其中一个编译器配合工作。...,除了这种模式外,我们还可以使用-Xint参数强制虚拟机运行于只有解释器编译模式下,这时 JIT 完全不介入工作;也可以使用参数-Xcomp强制虚拟机运行于只有 JIT 编译模式下。...虚拟机为每个方法准备了两计数器:方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter)。...锁消除 如果是在单线程环境下,其实完全没有必要使用线程安全容器,但就算使用了,因为不会有线程竞争,这个时候 JIT 编译会对这个对象方法锁进行锁消除。

    1.3K10

    Kotlin中关于内联函数一些理解分享

    内联函数理解 inline函数内联函数)从概念上讲是编译器使用函数实现真实代码来替换每一次函数调用,带来最直接好处就是节省了函数调用开销,而缺点就是增加了所生成字节码尺寸。...让我们分两种情况进行说明: 将普通函数定义为内联:众所周知,JVM内部已经实现了内联优化,它会在任何可以通过内联来提升性能地方将函数调用内联化,并且相对于手动将普通函数定义为内联,通过JVM内联优化所生成字节码...,每个函数实现只会出现一次,这样在保证减少运行时开销同时,也没有增加字节码尺寸;所以我们可以得出结论,对于普通函数,我们没有必要将其声明为内联函数,而是交给JVM自行优化。...lambda在函数调用点是不可用只有等到doSomething被内联后,该lambda才可以正常使用。...当lambda表达式在某个地方被保存起来,然后以变量形式传递给内联函数,那么此时lambda表达式代码将不会被内联

    50710

    控制命名空间分配外观

    可以指定不同前缀。为此,请在启用XML对象本身定义中设置XMLPREFIX参数。此参数有两个效果:它确保在XML输出中声明指定前缀。也就是说,即使没有必要这样做,它也会被声明。...控制空字符串("")导出方式为对象启用XML时,需要指定将空值和空字符串投影到XML方式其中一个选项是在支持xml中将XMLIGNORENULL设置为“RUNTIME”(不区分大小写)。...如果编写器RuntimeIgnoreNull属性为1,则该属性将导出为空元素或空属性(其导出方式与值$char(0)相同,后者始终导出为空元素或空导出)。...“encoded12”,按照SOAP 1.2标准中描述进行编码。创建内联引用在编码格式中,任何对象值属性都被作为引用包含,被引用对象被导出为单独元素。...要将这些属性内联导出,而不是作为单独元素,请将ReferencesInline属性设置为1。如果格式是“literal”,ReferencesInline属性没有效果。

    57520

    C++ 内联函数相关概念

    C++ 内联函数概念 介绍内联函数之前,需要说明一下 C ++ 在执行普通函数一个过程,在调用普通函数时,执行到函数调用指令时,程序将在函数调用后立即存储该指令内存地址,并将函数参数复制到堆栈,...这是因为内联函数是 C++ 为了提高程序运行速度所做一项改进,普通函数内联函数之间主要区别不在于编写方式,而在于 C++ 编译器如何将他们组合到程序中去,那究竟什么是内联函数呢,内联函数编译代码与其他程序代码...也就是说,编译器将使用相应函数代码替换函数调用。对于内联代码来说,程序无需跳转到另一个位置处执行代码,因此,可以说,内联函数运行速度比常规函数要快多。...上述展示了内联函数是如何运行,那么内联函数该怎么书写呢?...另外,还需要注意一点就是,应该有选择使用内联函数,如果函数执行代码时间比处理函数调用机制时间长,则对于使用内联函数所节省时间只占整个过程很小一部分,那么就没有必要使用内联函数

    64220
    领券