c++ - 为什么const std::array <std::array <float,1081>,2>&wavetable_h不指向原始数组?

标签 c++ pointers stdarray

我以为当您使用const std::array<float> & arr时,新数组仅指向原始数组的地址,但是在我的代码中,当我更改原始数组时,const array<>&不会随之变化。
这意味着我必须在主循环中不断设置它,而不是在进入主循环之前只设置一次。任何想法,我需要做些什么以使其不被复制,以及对为什么它是错误的一些解释,将不胜感激。
main.cpp:

void GeoHeadAudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer& midiMessages)
{
    juce::ScopedNoDenormals noDenormals;
    buffer.clear();
    proc0.setWavetable(waveforms); //Need to set it every time because it doesn't copy 
    proc1.setWavetable(waveforms); // causes glitches to slow
    proc0.processBlock(buffer, midiMessages);    
    proc1.processBlock(buffer, midiMessages);

}
public:
std::array<std::array<float, 1081>, 2> waveforms = {{ {0}, {0} }};
振荡器处理器.cpp:
public:
     void setWavetable(const std::array<std::array<float, 1081>, 2>& wavetable_h)
      {
         wavetable = wavetable_h;
      }
      void processBlock()
      {
         voice->setWavetable(wavetable, id);
      }

private:
     std::array<std::array<float, 1081>, 2> wavetable;
     SynthVoice* voice;
SynthVoice:
public:
   void setWavetable(const std::array<std::array<float, 1081>, 2>& wavetable_h, int id_h)
       {
           wavetable = wavetable_h;
           id = id_h;
        }

最佳答案

您对&的理解很好,但是问题出在类SynthVoice上:

public:
   void setWavetable(
       const std::array<std::array<float, 1081>, 2>& wavetable_h, // A
       int id_h
   )
   {
       wavetable = wavetable_h;  // B
       id = id_h;
   }
我对其进行了重新格式化,以便可以用A和B进行标记。当您专注于A(实际上是对数组的引用)时,请查看标记为B的行。
在那一行中,您正在将wavetable_h分配给.. something。
名为wavetable的东西,可能是SynthVoice类的字段,可能只是一个字段。您将无法分配给array<...>& wavetable,因为引用是不可分配的,因此无法编译。因此,很可能wavetable变量是array(非引用)。
这又意味着,行B将行A中作为引用传递的内容复制到变量wavetable中。这就是为什么您观察到在原始位置更改数组时数组未更新的原因。 SynthVoice的wavetable不是引用。它是一个副本,因此当您更改原始内容时,副本不会“更新自身”。
哦,我刚刚注意到了ossitorpreprocessor.cpp代码段。它有同样的问题-看起来和我在SynthVoice中所猜测的完全一样-std::array<std::array<float, 1081>, 2> wavetable;如果您将其更改为
std::array<std::array<float, 1081>, 2>& wavetable;
std::array<std::array<float, 1081>, 2>* wavetable;
std::shared_ptr<std::array<std::array<float, 1081>, 2>> wavetable;
std::reference_wrapper<std::array<std::array<float, 1081>, 2>> wavetable;
// ...
它将具有引用意义,并指向原始版本。所示的每个示例都有其自己的怪癖,因此请仔细考虑。但是它们每个都是对原始文件的某种引用/指针,而std::array<std::array<float, 1081>, 2>& wavetable;只是一个新的独立事物。

关于c++ - 为什么const std::array <std::array <float,1081>,2>&wavetable_h不指向原始数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63757255/

相关文章:

C++ 使用值初始化聚合类型的 std::array

c++ - 为什么 std::array::begin 不返回迭代器?

c++ - 如何将普通类中的模板成员特化为模板类型

C++11 数组初始化不会调用复制构造函数

c++ - 如何在 Visual Studio 中知道项目是 C 还是 C++?

无法将参数1从 'char [20][20]'转换为 'char ** '?

pointers - 循环中覆盖的封闭变量

c++ - 网络上对变量、指针、引用和内存地址的最佳解释在哪里?

c++ - 支持原始 UTF-8 的正则表达式引擎?

C++ char 类型值由操作系统定义?