c++ - 下面的c++程序有没有代码优化方法

标签 c++ optimization loops for-loop

        BYTE * srcData;
        BYTE * pData;

        int i,j;
        int srcPadding;

                    //some variable initialization

        for (int r = 0;r < h;r++,srcData+= srcPadding)
        {
            for (int col = 0;col < w;col++,pData += 4,srcData += 3)
            {
                memcpy(pData,srcData,3);        
            }
        }

我试过展开循环,但效果甚微。

        int segs = w / 4;
        int remain = w - segs * 4; 

        for (int r = 0;r < h;r++,srcData+= srcPadding)
        {
            int idx = 0;
            for (idx = 0;idx < segs;idx++,pData += 16,srcData += 12)
            {
                memcpy(pData,srcData,3);
                *(pData + 3) = 0xFF;
                memcpy(pData + 4,srcData + 3,3);
                *(pData + 7) = 0xFF;
                memcpy(pData + 8,srcData + 6,3);
                *(pData + 11) = 0xFF;
                memcpy(pData + 12,srcData + 9,3);
                *(pData + 15) = 0xFF;
            }
            for (idx = 0;idx < remain;idx++,pData += 4,srcData += 3)
            {
                memcpy(pData,srcData,3);
                *(pData + 3) = 0xFF;
            }
        }

最佳答案

根据您的编译器,对于这么小的拷贝,您可能根本不需要 memcpy。这是展开循环主体的变体版本;看看它是否更快:

uint32_t in0 = *(uint32_t*)(srcData);
uint32_t in1 = *(uint32_t*)(srcData + 4);
uint32_t in2 = *(uint32_t*)(srcData + 8);
uint32_t out0 = UINT32_C(0xFF000000) | (in0 & UINT32_C(0x00FFFFFF));
uint32_t out1 = UINT32_C(0xFF000000) | (in0 >> 24) | ((in1 & 0xFFFF) << 8);
uint32_t out2 = UINT32_C(0xFF000000) | (in1 >> 16) | ((in2 & 0xFF) << 16);
uint32_t out3 = UINT32_C(0xFF000000) | (in2 >> 8);
*(uint32_t*)(pData) = out0;
*(uint32_t*)(pData + 4) = out1;
*(uint32_t*)(pData + 8) = out2;
*(uint32_t*)(pData + 12) = out3;

您还应该将 srcDatapData 声明为 BYTE * restrict 指针,以便编译器知道它们没有别名。

关于c++ - 下面的c++程序有没有代码优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295031/

相关文章:

c++ - 在BoxSizer中获取wxStaticBitmap

c++ - 了解引用绑定(bind)

c++ - 优化嵌套 C++ 循环中的乘法器

python - 为什么不分配给循环变量修改原始列表?如何循环分配回列表?

c - 为什么循环会这样工作?

python - Instagram python bot,当我运行错误时如何关闭并重新启动?

c++ - 在网络上传输数据

c++ - 如何将字符串转换为模板类型

css - 如何从 main.css 文件中删除关键 CSS

iOS 应用程序 - 从 POD 安装 SDK 后应用程序的大小太大