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



我认为当您使用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分配给。。某物

那个叫做wavetable的东西,可能是SynthVoice类的一个字段,可能只是一个字段。您将无法分配给array<...>& wavetable,因为引用是不可分配的,所以它不会编译。因此,最有可能的是,wavetable变量是array,非引用。

这反过来意味着,行B将行A中作为引用传递的内容复制到变量wavetable中。这就是为什么当您在原始位置更改阵列时,会发现阵列没有更新。SynthVoice的wavetable不是参考。它是一个副本,所以当你更改原始内容时,副本不会"更新自己"。

哦,我刚刚注意到了oscillatorpreprocessor.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;
// ...

它将是参考ish并指向原件。每一个例子都有自己的怪癖,所以要仔细考虑。但它们中的每一个都是对原始内容的某种引用/指针,而std::array<std::array<float, 1081>, 2>& wavetable;只是一个新的独立事物。

因为wavetable是按值存储的类的私有成员,所以当您为其分配另一个数组时,该数组会复制到wavetable中。因此,改变其中一个不会影响另一个。

最新更新