簡體   English   中英

C ++ 11智能指針的索引向量作為類的成員

[英]C++11 indexing vector of smart pointers as member of a class

我的項目中有以下類: NeuronActivationNeuronLayerActivationLayer ,如下所述。

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]);
    }
};

我有以下兩個問題:

  • 實現/語法相關 :Layer現在使用神經元的shared_ptr 如果我計划使用unique_ptr而我的實現應該如何改變,因為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*>相比,你肯定只是稍微差一點。

暫無
暫無

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

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