簡體   English   中英

使用 shared_ptr 在類及其成員對象之間共享變量是一個很好的解決方案嗎?

[英]Is using a shared_ptr to share variables between class and its member objects a good solution?

我這樣做是為了在我的所有神經元之間共享learning_rate

class neural_network {
public:
  neural_network(float learning_rate = 0.005f)
      : learning_rate(new float(learning_rate)){};
  shared_ptr<float> learning_rate;

private:
  vector<neuron> neurons;
};

class neuron {
public:
  neuron(const float learning_rate) {
    this->learningRate = make_shared<float>(learningRate);
  };

private:
  const shared_ptr<const float> learning_rate;
};

這是在我的所有神經元上具有相同learning_rate的好解決方案嗎?

shared_ptr相當昂貴,我認為這里不需要它,只有網絡需要“擁有”學習率。 不要害怕在適當的地方使用原始指針,只需避免newdelete

class neuron {
public:
    neuron(const float& learning_rate)
        : learning_rate(&learning_rate){};

private:
    const float* learning_rate;
};

class neural_network {
public:
    neural_network(float learning_rate = 0.005f)
        : learning_rate(learning_rate){};
    float learning_rate;

    void make_neuron()
    {
        neurons.push_back(neuron(learning_rate));
    }

private:
    vector<neuron> neurons;
};

shared_ptr是共享所有權,而不是“共享實例”。

某些實例X生命周期與其成員之間存在明確定義的關系。 在最簡單的情況下,成員將一直活着,直到它們在X的析構函數中被銷毀。 成員通常不會在X的生命周期之后存活。 因此,不需要共享所有權。 您可以使用原始指針來強調neurons不參與learning_rate的所有權。

class neural_network
{
public:
    neural_network(float learning_rate = 0.005f)
        : learning_rate(learnin_rate) {};
    float learning_rate;
private:
    vector<neuron> neurons;
}

class neuron
{
public:
    neuron(const float* learning_rate) : learning_rate(learning_rate){}
private:
    const float* learning_rate;
}

PS:不確定,但我想我會應用一個相當不同的設計。 使learning_rate成為neurons的(非常量非指針)成員。 這時如果neural_network改變learning_rate它會調用元set_learning_rate方法來更新他們的學習速度。 這樣neuron就有機會在學習率變化時做出反應。

對於單個float ,我真的認為這一切都太過分了。 如果您的學習率可以變得更復雜,那是一回事,但在此處給出的代碼中? 我建議只使用neural_network的浮動成員和const neural_network* owner; 在構建過程中的neuron組中。

然后,你就打一個公共getLearningRate()neural_network就大功告成了。 而且您可能需要跟蹤各種網絡范圍的狀態,因此單個神經元可以從那個指針中獲得很多效用。 示例可能是日志、序列化流或臟標志。

獎勵:沒有動態分配,當你可以獲得它時,這總是一個很好的效率增益。 沒有與指針相關的緩存未命中,沒有new ing 或delete ing。

此外,我還以為你調用make_shared()neuron的構造函數將創建一個新的共享指針,指向相同的新實例float值。 這導致根learning_rate變化根本不影響現有的neuron實例。 (以及很多額外的、不需要的內存分配)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM