0

可变长度数组 (VLA) 如何占用内存空间?

我观察到 VLA 不占用连续的内存空间,任何人都可以确认一下吗?

void func(const IplImage *imgSrc, IplImage *imgDest)
{
  uchar *data = (uchar *)imgSrc->imageData;      

  // get the image data
  int height    = imgSrc->height;
  int width     = imgSrc->width;
  int step      = imgSrc->widthStep;
  int stepSobel = imgDest->widthStep;

  //Calculate Sobel of Image  
  uchar *dataSobel = (sobelStart + stepSobel);  

  //**Declaration of VLAs**
  int prevRowBuf[width],curRowBuf[width],nextRowBuf[width];

  for(int j=1;j<(width-1);j++)
  {    
    prevRowBuf[j] = data[j+1]-data[j-1];
    curRowBuf[j]  = data[step+j+1]-data[step+j-1];
  }

  // Some opencv processing
    for() // Some Conditions
    {

        //memcpy(prevRowBuf,curRowBuf,width);
        //memcpy(curRowBuf,nextRowBuf,width);

        //Replaced with
        for(int i=0 ; i< width; i++)
        {
          prevRowBuf[i]=curRowBuf[i];
          curRowBuf[i]=nextRowBuf[i];
        }
    } 
 }

通过这两个memcpy操作,我的程序仅适用于 VLA 的几个起始索引。但是在memcpyforLoop 替换后,我的程序对于 VLA 的所有索引都可以正常工作。

4

1 回答 1

4

首先,C++ 没有 VLA。GCC 将它们实现为非标准扩展

现在,在上述 GCC 扩展的背景下回答您的问题:

我观察到 VLA 不占用连续的内存空间,任何人都可以确认一下吗?

不,那是错误的。VLA 将占用连续的空间。该空间通常(总是?)来自堆栈而不是堆内存,就像静态大小的 C 数组一样。

于 2013-06-26T10:49:26.850 回答