[英]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
相當昂貴,我認為這里不需要它,只有網絡需要“擁有”學習率。 不要害怕在適當的地方使用原始指針,只需避免new
和delete
:
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.