考虑行主要,4通道,8位图像。我想将数据逐像素地传输到另一个大小相等的图像。由于每个像素有4 * 8 = 32位,我想在operator=
上使用int
赋值,而不是memcpy()
之类的替代或使用赋值{{1} 4个无符号字符(数据的实际布局)。
我有以下代码,但有一个问题:
operator=
CreateEquivalentImages(in, out);
for (int y = 0; y < in.rows; ++y)
{
for (int x = 0; x < in.cols; ++x)
{
int* pixel = (int*)in.data + x + y*width; //line in question
int* outpixel = (int*)out.data + x + y*width;
*outpixel = *pixel;
}
}
并未明确所执行的强制转换类型。哪个类型转换操作(int*)in.data
默认为?
(int*)in.data
是否正确地对数据指针进行类型转换?
结论:
int* pixel = reinterpret_cast<int*>(in.data) + x + y*width;
在行为(复制原始内存)和此问题的解决方案中是等效的。但是将原始内存强制转换为另一种类型(甚至是像int这样的内部类型),然后使用赋值运算符是特定于平台的,因此是未定义的行为。
答案 0 :(得分:3)
我认为你通过这样做会触发未定义的行为。我建议你分别分配每个组件(假设有4个unsigned char
值),并依靠你的编译器来有效地执行此操作。
请参阅: