我认为当您使用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
中。因此,改变其中一个不会影响另一个。