gpt4 book ai didi

java - getter 和 setter 会影响 C++/D/Java 中的性能吗?

转载 作者:IT老高 更新时间:2023-10-28 12:42:44 26 4
gpt4 key购买 nike

这是一个相当古老的话题:setter 和 getter 是好是坏?

我的问题是:编译器在C++/D/Java内联 getter 和 setter?

与直接字段访问相比,getter/setter 对性能(函数调用、堆栈帧)的影响程度。除了使用它们的所有其他原因之外,我想知道它们是否会影响性能,除了是一种良好的 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 应该能够内联它。我不知道 GCC 是如何处理这个问题的。

通过扩展,这也意味着如果 getter 定义在不同的 .dll/.so 中,则调用不能内联。

无论如何,我认为微不足道的 get/setter 不一定是“良好的 OOP 实践”,或者“使用它们的所有其他原因”。很多人认为微不足道的 get/setter 1) 是糟糕设计的标志,2) 浪费打字。

就我个人而言,这不是我为这两种方式而烦恼的事情。对我来说,要获得“良好的 OOP 实践”的资格,它必须具有一些可量化的积极影响。微不足道的 get/setter 有一些边际优势,还有一些同样微不足道的缺点。因此,我不认为它们是一个好的或坏的做法。如果你真的愿意,它们只是你可以做的事情。

关于java - getter 和 setter 会影响 C++/D/Java 中的性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com