【发布时间】:2014-11-03 01:27:35
【问题描述】:
最近我使用 getter 和 setter 方法进行了一些性能测试。我仍然不确定哪个是在 c++ 中使用它们的最佳方法。 (使用 int 等小类型没有区别。)
string i;
string GetTest()
{
return i;
}
void SetTest(string i)
{
this->i = i; //copy
}
这就是我将如何在 java/C# 中使用它的方式。没有引用/指针,在 C++ 中非常慢。 对于字符串、向量和其他“大”类型,如果频繁调用它会非常缓慢和糟糕
string i;
const string& GetTest()
{
return i;
}
void SetTest(const string& i)
{
this->i = i; //copy
}
目前我正在使用上面的这个版本,它比不使用参数和返回值的引用要快得多,并且使用 const 我确保它不会被更改。
string* i;
string& GetTest()
{
return *i;
}
void SetTest(string& i)
{
this->i = &i;
}
这个版本,使用指针比只使用引用要快,但我觉得它更难阅读,而且如果你想在类中使用值,你必须使用指针。
除了使用引用/指针之外,它还可以通过内联经常调用的 getter 和 setter 来稍微提高性能,因为它们是小函数。
inline GetTest(){....}
inline SetTest(){....}
但正如已经提到的,我仍然不确定在 c++ 中哪种方式是使用它们的最佳方式,或者是否有其他方式。消除这些歧义会很好。
编辑:
时隔近 4 年再次回到这一点, 这是我现在对现代 C++ 的建议:(比任何文本都更有帮助)
https://www.youtube.com/watch?v=xnqTKD8uD6451:00
我建议观看完整视频,Herb Sutter 如此出色的演讲者,一般关注 CppCon。
【问题讨论】:
-
带有
this->i = &i;的版本非常错误。您保留指向您一无所知的对象的指针。我建议忘记那些优化,先更好地学习 C++。 -
做性能测试!不要进行过早的优化!
-
如果你想(完全)很好地使用 C++,你需要摆脱 Java/C# 的习惯用法,比如到处使用 getter 和 setter。在 C++ 中,我们做的事情略有不同:我们致力于理解真正的问题并设计代码以很好地解决它——而实际上从不涉及使用 getter 或 setter。
-
通常的做法是在带有类声明的头文件中定义此类琐碎的单行函数。这将使它们隐含地
inline。 -
@R.MartinhoFernandes 纠正*输出垃圾的快速程序。
标签: c++ performance getter-setter