当数组作为参数传递时,调节内存的最有效方法是什么? 我学会了用Python编程,现在我正在学习C++,所以我道歉如果我使用的术语不是常规的也没有COMP。sci。教育或背景 我试图在C++中建立一个神经元。权重通常作为数组传递。当实例化神经元时,我需要传递一个权重数组。我一直试图让neuron对象只引用指针,这样我就不必复制了,但我一直在做错事。有人能不能修改一下代码,这样我就不会复制数组,然后解释一下你做了什么,为什么要这么做 class Neuron { private: double bias; int num_weights; double weights[]; public: Neuron(double*, int, double); double forward_prop(double[]); }; Neuron::Neuron(double weights[], int num_weights, double bias) { this->num_weights = num_weights; this->bias = bias; // rotate through weights pointer and reassign to object attribute 'weights' for (int i=0;i<this->num_weights;i++) { this->weights[i] = weights[i]; } // TODO: delete pointer } double Neuron::forward_prop(double values[]) { double output = this->bias; for (int i=0; i < this->num_weights; i++) { output += this->weights[i] * values[i]; } return output; } 这里是对你的类的改写,没有对象复制,使用C++标准库。下面的示例使用std::vector和移动语义来避免复制数据。注释位于代码示例之后: #include <vector> #include <numeric> #include <iostream> class Neuron { private: std::vector<double> weights; // We use a vector of doubles, not an array double bias; public: Neuron(std::vector<double>&, double); double forward_prop(const std::vector<double>&); }; Neuron::Neuron(std::vector<double>& weights_, double bias_) : weights(std::move(weights_)), bias(bias_) // The std::move avoids the copy {} double Neuron::forward_prop(const std::vector<double>& values) { // the std::inner_product function does what your code is doing now return std::inner_product(weights.begin(), weights.end(), values.begin(), bias); } int main() { std::vector<double> myWeights {1,2,3,4}; Neuron n(myWeights, 10); std::cout << n.forward_prop({5,6,7,8}); }

当数组作为参数传递时,调节内存的最有效方法是什么? 我学会了用Python编程,现在我正在学习C++,所以我道歉如果我使用的术语不是常规的也没有COMP。sci。教育或背景 我试图在C++中建立一个神经元。权重通常作为数组传递。当实例化神经元时,我需要传递一个权重数组。我一直试图让neuron对象只引用指针,这样我就不必复制了,但我一直在做错事。有人能不能修改一下代码,这样我就不会复制数组,然后解释一下你做了什么,为什么要这么做 class Neuron { private: double bias; int num_weights; double weights[]; public: Neuron(double*, int, double); double forward_prop(double[]); }; Neuron::Neuron(double weights[], int num_weights, double bias) { this->num_weights = num_weights; this->bias = bias; // rotate through weights pointer and reassign to object attribute 'weights' for (int i=0;i<this->num_weights;i++) { this->weights[i] = weights[i]; } // TODO: delete pointer } double Neuron::forward_prop(double values[]) { double output = this->bias; for (int i=0; i < this->num_weights; i++) { output += this->weights[i] * values[i]; } return output; } 这里是对你的类的改写,没有对象复制,使用C++标准库。下面的示例使用std::vector和移动语义来避免复制数据。注释位于代码示例之后: #include <vector> #include <numeric> #include <iostream> class Neuron { private: std::vector<double> weights; // We use a vector of doubles, not an array double bias; public: Neuron(std::vector<double>&, double); double forward_prop(const std::vector<double>&); }; Neuron::Neuron(std::vector<double>& weights_, double bias_) : weights(std::move(weights_)), bias(bias_) // The std::move avoids the copy {} double Neuron::forward_prop(const std::vector<double>& values) { // the std::inner_product function does what your code is doing now return std::inner_product(weights.begin(), weights.end(), values.begin(), bias); } int main() { std::vector<double> myWeights {1,2,3,4}; Neuron n(myWeights, 10); std::cout << n.forward_prop({5,6,7,8}); },c++,arrays,pointers,neural-network,instantiation,C++,Arrays,Pointers,Neural Network,Instantiation,以下是要点: 使用std::vector代替数组和指针。注意,我们不再需要num_weights成员变量,因为向量通过调用std::vector的size成员函数已经知道了自己的大小 在Neuron构造函数中,当我们将传入的向量分配给对象的成员时,我们发出对std::move的调用。这将调用std::vector中内置的移动语义。基本上,源向量使用的指针被窃取或移动到目标向量中,从而避免了复制 请注意,完成此操作后,源向量将发生更改。传入的向量实际上将变为空,请记住,它的内容已移出 最重要的是,

以下是要点:

使用std::vector代替数组和指针。注意,我们不再需要num_weights成员变量,因为向量通过调用std::vector的size成员函数已经知道了自己的大小

在Neuron构造函数中,当我们将传入的向量分配给对象的成员时,我们发出对std::move的调用。这将调用std::vector中内置的移动语义。基本上,源向量使用的指针被窃取或移动到目标向量中,从而避免了复制

请注意,完成此操作后,源向量将发生更改。传入的向量实际上将变为空,请记住,它的内容已移出

最重要的是,我使用了你的前进道具

附加项-请注意在编写构造函数时成员初始化列表的用法。另外,对forward_prop的调用利用了std::vector的大括号初始化语法,这就是为什么在调用forward_prop时,不需要显式声明std::vector

请注意,真正需要注意的是,从C++11开始,语言中正式引入了移动语义。这允许以正式的方式进行移动而不是复制

随着移动语义现在成为可能,添加了额外的函数,如std::move、move构造函数和move赋值运算符、在一些STL容器类中放置回成员函数、std::unique_ptr工作,而不是一些破损的std::auto_ptr等


<> P> C++ 11之前,你必须做指针技巧,或者希望编译器的优化器隐式地移动,即使没有这种操作的正式名称。

< P>这里是对你的类的重写,没有对象复制,使用C++标准库。下面的示例使用std::vector和移动语义来避免复制数据。注释位于代码示例之后:

#include <vector>
#include <numeric>
#include <iostream>

class Neuron 
{
    private:
        std::vector<double> weights;  // We use a vector of doubles, not an array
        double bias; 

    public:
    
        Neuron(std::vector<double>&, double);
        double forward_prop(const std::vector<double>&);
};

Neuron::Neuron(std::vector<double>& weights_, double bias_) : weights(std::move(weights_)), bias(bias_) // The std::move avoids the copy
{}

double Neuron::forward_prop(const std::vector<double>& values) 
{
    // the std::inner_product function does what your code is doing now
    return std::inner_product(weights.begin(), weights.end(), values.begin(), bias);
}

int main()
{
    std::vector<double> myWeights {1,2,3,4};
    Neuron n(myWeights, 10);
    std::cout << n.forward_prop({5,6,7,8});
}
以下是要点:

使用std::vector代替数组和指针。注意,我们不再需要num_weights成员变量,因为向量通过调用std::vector的size成员函数已经知道了自己的大小

在Neuron构造函数中,当我们将传入的向量分配给对象的成员时,我们发出对std::move的调用。这将调用std::vector中内置的移动语义。基本上,源向量使用的指针被窃取或移动到目标向量中,从而避免了复制

请注意,完成此操作后,源向量将发生更改。传入的向量实际上将变为空,请记住,它的内容已移出

最重要的是,我使用了你的前进道具

附加项-请注意在编写构造函数时成员初始化列表的用法。另外,对forward_prop的调用利用了std::vector的大括号初始化语法,这就是为什么在调用forward_prop时,不需要显式声明std::vector

请注意,真正需要注意的是,从C++11开始,语言中正式引入了移动语义。这允许以正式的方式进行移动而不是复制

随着移动语义现在成为可能,添加了额外的函数,如std::move、move构造函数和move赋值运算符、在一些STL容器类中放置回成员函数、std::unique_ptr工作,而不是一些破损的std::auto_ptr等


在C++11之前,您必须执行指针技巧,或者希望编译器的优化器隐式地执行移动操作,即使这种类型的操作没有正式名称。

在您的类中,double weights[];不是合法的C++。如果你想避免复制“数组”,实际上它是一个指针,然后只复制指针->权重=权重;至少可以说这是不是一个好主意,但这就是你应该怎么做的。你也不需要在几乎所有你正在使用它的地方都指定这个->我学会了编程
在Python中,警告一个字:不要用Python或任何其他语言作为编写正确C++代码的模型。我一直在尝试让神经元对象引用指针,这样我就不必复制一个副本——那么哪个实体拥有指针?是Neuron对象,还是调用者?我认为您仍然应该坚持编写高级代码,但使用现代技术,例如移动语义、使用具有良好缓存局部性的数据结构等。如果使用探查器测量后出现性能问题,然后考虑使用指针的低级技术。在你的类中,双权值[];不是合法的C++。如果你想避免复制“数组”,实际上它是一个指针,然后只复制指针->权重=权重;至少可以说这是不是一个好主意,但这就是你应该怎么做的。你也不需要在几乎所有你正在使用它的地方都指定这个->我在Python中学习了编程一个警告字:不要用Python或任何其他语言作为编写正确C++代码的模型。我一直在尝试让神经元对象引用指针,这样我就不必复制一个副本——那么哪个实体拥有指针呢?它是神经元对象,还是调用方?我认为您仍然应该坚持编写高级代码,但是使用现代技术示例,移动语义,使用具有良好缓存局部性的数据结构等。如果在使用分析器测量之后存在性能问题,那么考虑使用指针的低级技术。明确说明在构造n之后myWeights就消失了。是的,也可以这样做。我们都在强调的一点是,移动语义基本上满足了OP不进行复制的愿望。明确说明在构造n之后myWeights就消失了。是的,也可以这样做。我们都在强调的一点是,移动语义基本上满足了OP不进行复制的愿望。