有人可以解释以下三个功能之间的区别吗?

typedef union
{
    std::uint8_t B, G, R, A;
    std::uint32_t Colour;
} BGRA;

第一:
void Image::process_pixels(void* out, void* in)
{
    unsigned int i, j;
    BGRA* pOut = (BGRA*)out;
    unsigned char* pIn = (unsigned char*)in;

    for (i = 0; i < height; ++i)
    {
        for (j = 0; j < width; ++j)
        {
            pOut->B = *(pIn++);
            pOut->G = *(pIn++);
            pOut->R = *(pIn++);
            pOut->A = *(pIn++);
            ++pOut;
        }
    }
}

第二名:
void Image::process_pixels(void* out, void* in)
{
    unsigned int i, j;
    unsigned int* pOut = (unsigned int*)out;
    unsigned int* pIn = (unsigned int*)in;

    for (i = 0; i < height; ++i)
    {
        for (j = 0; j < width; ++j)
        {
            *pOut++ = *pIn++
        }
    }
}

第三名:
void Image::process_pixels(void* out, void* in)
{
    unsigned int i, j;
    BGRA* pOut = (BGRA*)out;
    unsigned char* pIn = (unsigned char*)in;

    for (i = 0; i < height; ++i)
    {
        for (j = 0; j < width; ++j)
        {
            memcpy(pOut, pIn, sizeof(int));
            ++pOut;
            pIn += sizeof(int);
        }
    }
}

如果我使用第二个或第三个实现,则代码可以正常工作。图像可以正确渲染。但是,如果使用第一个实现,则不会正确呈现任何内容。

我可以保证sizeof(BGRA) = sizeof(int)。我可以保证像素的BGRA格式。但是不知何故我得到了不同的结果。

我一生都看不到前两个实现之间的区别。有任何想法吗?

最佳答案

typedef union
{
    std::uint8_t B, G, R, A;
    std::uint32_t Colour;
} BGRA;

这里BGRA是共享相同地址的4个元素。
您应该将BGRA封装在类似的结构中
typedef union
{
    struct {
        std::uint8_t B, G, R, A;
    } Components;
    std::uint32_t Colour;
} BGRA;

10-08 19:52