c++ - Getter & Setter 的最佳表现

标签 c++ performance getter-setter

最近我使用 getter 和 setter 方法做了一些性能测试。我仍然不确定哪种是在 C++ 中使用它们的最佳方法。 (使用像 int 等小类型没有区别)

string i;

string GetTest()
{
    return i;
}
void SetTest(string i)
{
    this->i = i; //copy
}

这就是我在 java/C# 中使用它的方式。没有引用/指针,在 C++ 中非常慢。 对于字符串、 vector 和其他“大”类型,如果频繁调用,这将非常缓慢且糟糕

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=xnqTKD8uD64 51:00

我建议观看完整视频,Herb Sutter 是一位非常棒的演讲者,一般都关注 CppCon。

最佳答案

[我从我之前在 Simple C++ getter/setters 的回答中完全复制了第一段] 通常完全使用访问器/修改器是一种设计味道,表明您的类公共(public)接口(interface)不完整。通常来说,您需要一个有用的公共(public)接口(interface)来提供有意义的功能,而不是简单的获取/设置(这比我们在 C 语言中使用结构和函数要好一两个步骤)。每次你想写一个修改器,很多时候你想先写一个访问器,只需退后一步问问自己“我真的需要这个吗?”。

现在,如果您真的想要特定属性的 getter/setter:前两个版本中的任何一个都是正确的,尽管第二个版本在某些情况下可能表现更好。 getter 应该是 const (const string& GetTest() const) 以便可以在 const 对象上调用它们。

您的带有指针的第三个版本非常危险。虽然前两个具有非常明确的所有权语义,但第三个没有。您显示的简短片段没有清理,这意味着 set 函数的调用者必须在您的类(class)期间保持字符串处于事件状态(无所有权转移)。完全避免这种构造。

最后,如果您只是学习 C++,请考虑 C++ 书籍列表中的一本或多本书籍 The Definitive C++ Book Guide and List

编辑:如果您正在尝试提高代码的性能,最好的方法是对编译器进行优化,然后分析并查看热点在哪里。

关于c++ - Getter & Setter 的最佳表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747774/

相关文章:

c++ - 使用 QtConcurrent::map 作为并行 for 循环

node.js - 给所有用户的 GCM 消息(无主题)

java - 如何在 getter 和 setter 方法中正确使用 if else 语句?

java - FindBugs EI_EXPOSE_REP 错误是否只涉及日期?

c++ - 我需要显式调用基本虚拟析构函数吗?

c++ - 错误 undefined reference `BP::Device::Create(std::string const&)'

c++ - Microsoft Visual Studio 2013 链接错误 1104

mysql - Mnesia 中的唯一约束

performance - JIT 性能是否会因可写页面而受到影响?

java - 在 fragment 上使用 setter 时出现 NullPointerException