gpt4 book ai didi

c++ - 通过指针访问如此昂贵吗?

转载 作者:行者123 更新时间:2023-11-30 02:25:42 27 4
gpt4 key购买 nike

我有一个 Process() 函数,它在我的 DLL(VST 插件)中被调用得非常重,加载到 DAW(主机软件)中,例如:

for (int i = 0; i < nFrames; i++) {
// ...

for (int voiceIndex = 0; voiceIndex < PLUG_VOICES_BUFFER_SIZE; voiceIndex++) {
Voice &voice = pVoiceManager->mVoices[voiceIndex];
if (voice.mIsPlaying) {
for (int envelopeIndex = 0; envelopeIndex < ENVELOPES_CONTAINER_NUM_ENVELOPE_MANAGER; envelopeIndex++) {
Envelope &envelope = pEnvelopeManager[envelopeIndex]->mEnvelope;
envelope.Process(voice);
}
}
}
}

void Envelope::Process(Voice &voice) {
if (mIsEnabled) {
// update value
mValue[voice.mIndex] = (mBlockStartAmp[voice.mIndex] + (mBlockStep[voice.mIndex] * mBlockFraction[voice.mIndex]));
}
else {
mValue[voice.mIndex] = 0.0;
}
}

它基本上占用主机内 2% 的 CPU(这很好)。

现在,如果我稍微更改一下代码(基本上是增量和赋值):

void Envelope::Process(Voice &voice) {
if (mIsEnabled) {
// update value
mValue[voice.mIndex] = (mBlockStartAmp[voice.mIndex] + (mBlockStep[voice.mIndex] * mBlockFraction[voice.mIndex]));

// next phase
mBlockStep[voice.mIndex] += mRate;
mStep[voice.mIndex] += mRate;
}
else {
mValue[voice.mIndex] = 0.0;
}

// connectors
mOutputConnector_CV.mPolyValue[voice.mIndex] = mValue[voice.mIndex];
}

CPU 占用 6/7%(请注意,那些 var 不与代码的其他部分交互,至少我是这么认为的)。

我能想到的唯一原因是访问指针很重?我怎样才能减少这个 CPU 数量?

那些数组是基本的双“指针”数组(最轻量级的 C++ 容器):

double mValue[PLUG_VOICES_BUFFER_SIZE];
double mBlockStartAmp[PLUG_VOICES_BUFFER_SIZE];
double mBlockFraction[PLUG_VOICES_BUFFER_SIZE];
double mBlockStep[PLUG_VOICES_BUFFER_SIZE];
double mStep[PLUG_VOICES_BUFFER_SIZE];

OutputConnector mOutputConnector_CV;

有什么建议吗?

最佳答案

您可能认为“指针数组”是最轻的容器。但是 CPU 不考虑容器。他们只是通过指针读写值。

这里的问题很可能是知道两个容器不重叠(没有“子容器”)。但是编译器可能不会告诉 CPU。写入 mBlockStep 可能会影响 mBlockFraction。编译器没有运行时值,所以它需要处理它有的情况。这将意味着引入更多的内存读取,并减少寄存器中的值缓存。

关于c++ - 通过指针访问如此昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43887384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com