我有以下类在我的项目:Neuron
,ActivationNeuron
,Layer
,并ActivationLayer
为部分下面提到。
class Neuron { }; /* abstract class */
class ActivationNeuron : public Neuron { };
class Layer {
protected:
vector<shared_ptr<Neuron>> neurons;
public:
Neuron& operator[](const int index) {
return *this->neurons[index];
}
};
class ActivationLayer : public Layer {
public:
ActivationNeuron& operator[](const int index) {
return *static_pointer_cast<ActivationNeuron>(this->neurons[index]);
}
};
我有以下两个问题:
与实现/语法有关:层现在使用shared_ptr
s个神经元。如果我打算改用unique_ptr
s,那么我的实现应如何更改(鉴于static_pointer_cast
不适用于)unique_ptr
?
语义相关:unique_ptr
在这种情况下,我是否应该全部使用s,因为其他类(包括我的测试用例)中的代码通常会调用索引运算符来调用ActivationNeuron
引用上的函数?
更多语义:仅当Layer
实例在范围内时,才保证使用数据(不延迟日志记录)。如果我改为选择返回pointer<Neuron>
而pointer<ActivationNeuron>
不是引用,那么对指针类型的决定有何影响?我更关注移动/复制的语义和所有权策略,而不是性能上的(非激烈的)影响。
我也欢迎对我当前的实现进行改进。
根据http://www.cplusplus.com/reference/memory/static_pointer_cast/,您拥有的等同于
return *static_cast<ActivationNeuron*>(this->neurons[index].get());
上面的语句也适用于unique_ptr。
在语义方面,您正在更改所有权模型。在任何人都无法抓住指针之前。现在它们将被绑定到Layer
。如果所有用法都Layer
存在,那应该没问题。如果Layer
销毁后需要某些组件来访问数据(例如延迟日志记录),则会遇到问题。
不知道较大的应用程序是否很难解决。
性能明智:静态类型转换,索引编制和.get()几乎是微不足道的(O(1)复杂性,仅是内存索引编制),我不必为它们的性能担心太多。您可以进行配置文件,以确保在您的应用程序中是这种情况。与相比,您肯定只差一点点vector<Neuron*>
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句