使用 RCObject 与静态内联 C++ 进行引用计数

问题描述 投票:0回答:1

我目前正在阅读 Scott Meyers 所著的 More Effect C++ (1995)。

在第 29 项 - 引用计数中,作者提到使用引用计数的主要好处是

  • (1)“简化堆对象的记账”
  • (2) 内存和性能效率。

书中建议我们使用 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 中提供的方法?或者他们实际上完成了不同的事情?

c++ reference-counting
1个回答
0
投票

您正在比较两个完全不同的事物!

字符串示例是关于重用字符串的数据,可能是稍后复制字符串并等待自己的数据复制,直到数据应该被修改(写入时复制)或任何其他算法。它本身就是共享数据的实现。引用计数器计算这些数据的“用户”数量,而不是所有对象的数量。

第二个实际上是关于对象计数,它真正为您提供执行期间所有存活对象的数量。

© www.soinside.com 2019 - 2024. All rights reserved.