int与相同大小的BGRA联合会产生不同的结果

时间:2015-08-09 03:24:43

标签: c++ unions

有人可以解释下面三个函数之间的区别吗?

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格式。但不知怎的,我得到了不同的结果..

我无法看到我的生活,第一个和最后两个实现之间的区别。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分:1)

这个联盟有五名成员。你似乎认为它只有两个。