我有一个包含实现指针的类。因此,在某些功能中,我多次提到实现的成员。写
是个好主意// 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做同样的事情?
答案 0 :(得分:4)
不要尝试使用现代编译器,因为他们非常重视代码优化:回避那些声称的改进技巧。
不仅是混淆,而且方法1也容易受到错误的重构者在&
的定义中删除str
的影响:如果这样做,则返回的指针将悬空和程序行为 undefined !由于这些原因,我不允许在我的代码库中使用方法1。
答案 1 :(得分:3)
从8.3.2参考文献§4
未指明引用是否需要存储
所以我建议使用看起来更具可读性的代码,并将剩下的代码留给编译器。