gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:47:12 25 4
gpt4 key购买 nike

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

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;

关于c++ - 相同大小的 int 与 BGRA 并集产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com