当前位置: 首页 > 面试题库 >

吸收器和设置器会影响C ++ / D / Java的性能吗?

丁雅逸
2023-03-14
问题内容

这是一个比较古老的话题:二传手和getter是好是坏?

我的问题是:C ++ / D / Java中的编译器是否可以内联吸气剂和吸气剂?

与直接现场访问相比,吸气器/设置器在多大程度上影响性能(函数调用,堆栈框架)。除了使用它们的所有其他原因之外,我想知道它们是否应该作为良好的OOP惯例而影响性能


问题答案:

这取决于。没有普遍的答案永远是正确的。

在Java中,JIT编译器可能 迟早 会对其进行内联。据我所知,JVM
JIT编译器仅优化频繁使用的代码,因此您可以看到最初的函数调用开销,直到足够频繁地调用getter / setter为止。

在C ++中,几乎可以肯定它会内联(假设启用了优化)。但是,在一种情况下可能不会:

// foo.h
class Foo {
private:
  int bar_;

public:
  int bar(); // getter
};

// foo.cpp
#include "foo.h"

int Foo::bar(){
  return bar_;
}

如果该函数的定义对于该类的用户不可见(它将包含foo.h,但看不到foo.cpp),则编译器可能无法内联该函数调用。

如果启用链接时代码生成作为优化,则MSVC应该能够内联它。我不知道海湾合作委员会如何处理这个问题。

通过扩展,这还意味着,如果在另一个.dll / .so中定义了getter, 无法内联调用。

无论如何,我认为琐碎的get /
setter不一定是“良好的OOP惯例”,也不是“有其他所有使用它们的原因”。很多人认为琐碎的获取/设置对1)表示设计不好,2)浪费打字。

就个人而言,这不是我对这两种方法都感到不适的事情。对我来说,要使某项东西具有“良好的面向对象操作规范”的资格,就必须产生一些可量化的积极影响。琐碎的get
/ setter方法有一些边际优势,也有一些微不足道的劣势。因此,我认为这不是好事。如果您确实愿意,它们只是您可以做的事情。



 类似资料:
  • 问题内容: varchar列上的索引是否会使查询运行缓慢?我可以将其设为int。而且我不需要做LIKE%比较。 问题答案: varchar列上的索引是否会使查询运行缓慢? 不,不是的。 如果优化器决定使用索引,则查询将运行得更快。 该表上的s / s / s会变慢,但不太可能引起注意。 我不需要做LIKE%比较 请注意,使用: …将 不 使用索引,但以下内容将: 关键是在字符串的左侧使用通配符,这

  • 问题内容: 我有这个JavaWeb应用程序,它可以从电子表格上传成千上万的数据,该电子表格是从上到下按行读取的。我用来在服务器端显示应用程序当前正在读取的行。 -我知道要创建一个日志文件。实际上,我正在创建一个日志文件,同时在服务器提示符下显示日志。 还有其他方法可以在提示上打印当前数据? 问题答案: 它可能会影响您的应用程序性能。大小会因您所运行的硬件类型和主机上的负载而异。 可以将其转化为性能

  • 问题内容: 在浏览器中,缩小和隐藏或加载异步JavaScript会对性能产生积极影响。在Node.js中运行的代码是否也是如此? 如Example那样,过多的注释和为实例化的类的属性使用长名称通常会严重影响性能和内存使用吗? 问题答案: 是的 ,它可以提高编译时的性能,但是编译时对您的整个过程生命周期而言无关紧要,因此无关紧要。唯一的区别是,如果您出于某种奇怪的原因而不断地启动和停止节点程序,那么

  • 问题内容: 例如,我喜欢在Redis中使用冗长的名称。 这样可以吗?还是会影响性能? 问题答案: 您正在谈论使用的密钥并没有那么长。 您提供的示例键用于一个集合,集合查找方法为O(1)。集合(SDIFF,SUNION,SINTER)上更复杂的操作是O(N)。可能的是,与使用较长的键相比,填充是更昂贵的操作。 Redis带有一个称为的基准实用程序,如果您修改src / redis-benchmark

  • 问题内容: 我想在应用程序崩溃时获取堆栈跟踪。我知道,-rdynamic选项可以获取带有函数名称的完整堆栈跟踪。但是我担心是否会对我的应用程序性能产生影响。 问题答案: 是的,尽管它非常具体,通常不会引起关注,但确实存在。 -rdynamic选项指示链接器将符号添加到运行时通常不需要的符号表中。这意味着动态链接程序需要在运行时清除更多(可能)更多的符号以实现符号解析。 具体来说,由于基于GNU的系

  • 已安装Lombok插件。使用Intellij15。模型的结构显示了getters和setters,但我从thymeleaf得到以下错误。 错误: