作为类成员的智能指针的C ++ 11索引向量

阿卜拉·巴萨(Abhra Basak)

我有以下类在我的项目:NeuronActivationNeuronLayer,并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_ptrs个神经元。如果我打算改用unique_ptrs,那么我的实现应如何更改(鉴于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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章