C ++指向字节数组优化的指针

时间:2014-12-05 00:47:32

标签: c++ windows optimization visual-studio-2013

我目前正在使用这种方法复制一些字节值:

    for (int i = 0; i < (iLen + 1); i++)
    {
        *(pBuffer + i) = Image.pVid[i];
    }

我想问一下是否有办法一次性复制这些值,也许是通过使用memcopy来获得更快的速度。

整个代码是:

extern "C" __declspec(dllexport) int __stdcall GetCameraImage(BYTE pBuffer[], int Type, int uWidth, int uHeight)
{
    CameraImage Image;

    int ret;

    Image.pVid = (unsigned int*)malloc(4 * uWidth*uHeight);
    ret = stGetCameraImage(&Image, 1, uWidth, uHeight);
    if (ret == ERR_SUCCESS)
    {
        int iLen = (4 * uWidth * uHeight);

        for (int i = 0; i < (iLen + 1); i++)
        {
            *(pBuffer + i) = Image.pVid[i];
        }

        ////print(“ImageType = %d, width = %d, height = %d”, Image.Type, Image.Width,
        ////    Image.Height);
        ////print(“First Pixel : B = %d, G = %d, R = %d”, Image.pVid[0], Image.pVid[1],
        ////    Image.pVid[2]);
        ////print(“Second Pixel : B = %d, G = %d, R = %d”, Image.pVid[4], Image.pVid[5],
        ////    Image.pVid[6]);
    }

    free(Image.pVid);

    return ret;
}

编辑:
* pVid是这样的:

unsigned int *pVid;             // pointer to image data (Format RGB32...)

1 个答案:

答案 0 :(得分:1)

当前编写代码的方式,循环中的每个赋值都会溢出并在pBuffer中为您提供一些垃圾值,因为您尝试将unsigned int分配给BYTE 。最重要的是,您将在Image.pVid数组的末尾运行,因为i计算字节数,而不是unsigned int s

您可以通过以下方式修复代码:

*(pBuffer + i) = ((BYTE*)Image.pVid)[i];

但这是非常低效的。最好一次移动整个单词,或者只使用memcpy:

memcpy(pBuffer,Image.pVid,iLen)  //pBuffer must be at least iLen bytes long