[英]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.