相同大小的 int 与 BGRA 并集产生不同的结果

int vs. BGRA union of the same size produces different results

谁能解释一下下面三个函数的区别?

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;

这个工会有五个成员。你好像认为它只有两个。