我以为当您使用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/