我应该使用参考吗?
Should I use a reference?
我有一个包含实现指针的 class。因此,在某些函数中,我多次引用某个成员的实现。写
是个好主意吗
// approach 1
std::string & str = m_pImpl->m_str;
str.clear();
str += "blablabla";
// ...
return str.c_str();
一次并使用引用来保存指针间接,还是我应该保存引用变量(这总是 4 或 8 个字节,就像指针一样,对吧?)?
// approach 2
m_pImpl->m_str.clear();
m_pImpl->m_str += "blablabla";
// ...
return m_pImpl->m_str.c_str();
在我的用例中,变量 m_pImpl->m_str 使用了大约 10 到 20 次。恐怕我很难描述这两种方法之间的性能差异。有人知道或有人可以测试它有什么不同吗?这是否取决于我使用变量的频率(一次对 20 次对 10000 次)?或者一个体面的编译器是否会做与方法 1 相同的事情?
不要尝试做现代编译器的工作,因为它们非常重视代码优化:回避诸如此类声称的改进技巧。
它不仅令人困惑,而且方法 1 也容易受到错误重构者在 str
的定义中删除 &
的攻击:如果这样做,则返回的指针将是 悬挂 和程序行为未定义!出于这些原因,我会在我的代码库中禁止方法 1。
来自 8.3.2 参考文献 §4
It is unspecified whether or not a reference requires storage
所以我建议使用对您来说更具可读性的代码,其余的留给编译器。
我有一个包含实现指针的 class。因此,在某些函数中,我多次引用某个成员的实现。写
是个好主意吗// approach 1
std::string & str = m_pImpl->m_str;
str.clear();
str += "blablabla";
// ...
return str.c_str();
一次并使用引用来保存指针间接,还是我应该保存引用变量(这总是 4 或 8 个字节,就像指针一样,对吧?)?
// approach 2
m_pImpl->m_str.clear();
m_pImpl->m_str += "blablabla";
// ...
return m_pImpl->m_str.c_str();
在我的用例中,变量 m_pImpl->m_str 使用了大约 10 到 20 次。恐怕我很难描述这两种方法之间的性能差异。有人知道或有人可以测试它有什么不同吗?这是否取决于我使用变量的频率(一次对 20 次对 10000 次)?或者一个体面的编译器是否会做与方法 1 相同的事情?
不要尝试做现代编译器的工作,因为它们非常重视代码优化:回避诸如此类声称的改进技巧。
它不仅令人困惑,而且方法 1 也容易受到错误重构者在 str
的定义中删除 &
的攻击:如果这样做,则返回的指针将是 悬挂 和程序行为未定义!出于这些原因,我会在我的代码库中禁止方法 1。
来自 8.3.2 参考文献 §4
It is unspecified whether or not a reference requires storage
所以我建议使用对您来说更具可读性的代码,其余的留给编译器。