我目前正在阅读 Scott Meyers 所著的 More Effect C++ (1995)。
在第 29 项 - 引用计数中,作者提到使用引用计数的主要好处是
书中建议我们使用 RCObjects 来实现这个目标。例如:
class String
{
public:
String(const char* value = "");
String& operator=(const String& rhs);
~String();
private:
// Holds a reference count and a string value
struct StringValue
{
size_t refCount;
bool shareable;
char* data;
StringValue(const char *initValue);
~StringValue();
};
// Value of this String
StringValue* value;
};
然而,我学习C++的第一本书(Beginning C++20,第6版,Ivor Horton)提到,从C++17开始,我们也可以使用“静态内联”变量来完成引用计数。例如:
class Test
{
public:
Test(int number)
: m_number { number}
{
++m_count;
}
~Test()
{
--m_count;
}
static std::size_t getCount()
{
return m_count;
}
private:
int m_number;
static inline std::size_t m_count = 0;
};
int main()
{
Test t1 { 1 };
Test t2 { 1 };
Test t3 { 1 };
Test t4 { 1 };
std::cout << Test::getCount(); // 4
}
我想知道是否应该使用更有效的 C++ 或 Beginning C++20 中提供的方法?或者他们实际上完成了不同的事情?
您正在比较两个完全不同的事物!
字符串示例是关于重用字符串的数据,可能是稍后复制字符串并等待自己的数据复制,直到数据应该被修改(写入时复制)或任何其他算法。它本身就是共享数据的实现。引用计数器计算这些数据的“用户”数量,而不是所有对象的数量。
第二个实际上是关于对象计数,它真正为您提供执行期间所有存活对象的数量。