С++: переменная длина массива

Как массивы переменной длины (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. Но после замены memcpy на for Loop моя программа отлично работает для всех индексов VLA.

Ответ 1

Во-первых, у C++ нет VLA. GCC реализует их как нестандартное расширение.

Теперь, чтобы ответить на ваш вопрос в контексте указанного расширения GCC:

Я заметил, что VLA не занимают непрерывное пространство памяти, кто-нибудь может подтвердить то же самое?

Нет, это неправильно. VLA будут занимать непрерывное пространство. Это пространство обычно (всегда?) Исходит из стека, а не из памяти кучи, как статические массивы Си.