首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理大型C数组时的内存问题

处理大型C数组时的内存问题
EN

Stack Overflow用户
提问于 2014-11-26 03:24:55
回答 1查看 76关注 0票数 1

编辑:发现我不需要乘以FRAMESIZE。框架来自libsndfile (我忽略了这个API ),其语义与在我的程序中定义框架的方式不同。因此,在尺寸帧*2和单帧是大小帧。

我接受了下面的一个答案,这个答案并不完全正确,但却把我推向了正确的方向。谢谢jxh。

我正在做一些音频工作,用C++写一个效果。我有一个输入源,它是一个交错的2通道样本数组.我已经发现,将立体声数组转换为单数组(getMono())的函数只需调用一次,就会导致大量内存膨胀(12.7MB之前,3.69GB之后)。这也是极其缓慢的。在我的测试用例中,立体声阵列的尺寸是800254。

相对来说,我是C++的新手。我在大学里做了很多嵌入式C,但不是这样的。所以,这可能是一个初学者的错误。

我已经将我的代码缩减到了理解和再现错误所需的最小数量的代码。本质上,setInput在Sukothai构造函数中被调用,然后生成输入数组的单一版本。

代码语言:javascript
复制
#define SAMPLE float    
#define RANDOMWIN .5
#define FRAMESIZE 512


void Sukothai::getMono(SAMPLE * stereo, SAMPLE * mono, int monoSize){
  for (int j = 0; j < monoSize; j++) {
    mono[j] = .7071*(stereo[j*2] + stereo[j*2+1]);
  }
}

void Sukothai::setInput(SAMPLE * in, int frames) {
  // per-iteration additional time in terms of seconds
  //float extraTime = RANDOMWIN*2;

  // new buffer size in terms of samples
  //int newSize = ((int)(maxIter*extraTime*2*THE_SRATE)+frames*FRAMESIZE*2);

  //SAMPLE * current_buffer = new SAMPLE[newSize];

  SAMPLE * mono;
  int currentMonoSize = 0;

  currentMonoSize = frames*FRAMESIZE;
  mono = new SAMPLE[currentMonoSize];
  getMono(in, mono, currentMonoSize);
}

现在,这里有三行被注释掉。这些行创建变量extraTimenewSizecurrent_buffer。这些都是我不同部分效果的一部分。我在这里对它们进行了注释,以表明它们与立体音响无关,但如果我在代码中将它们注释掉,就会出现分段错误。

有人知道这是怎么回事吗?

编辑:添加了FRAMESIZE定义

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-26 03:42:37

在输入数组frames中只有in元素,并且计算currentMonoSize为该值的512倍。然后,在getMono()中,继续从in (不称为stereo)读取currentMonoSize的数量的两倍。这意味着您正在阅读的内容远远超出了您指定的in中元素的数量。

从逻辑上讲,mono数组的元素应该是stereo输入的一半。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27140806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档