如何正确地对数据开始指针进行类型转换(这是不是很好的做法)?

时间:2015-02-27 16:35:08

标签: c++ casting

考虑行主要,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这样的内部类型),然后使用赋值运算符是特定于平台的,因此是未定义的行为。

1 个答案:

答案 0 :(得分:3)

我认为你通过这样做会触发未定义的行为。我建议你分别分配每个组件(假设有4个unsigned char值),并依靠你的编译器来有效地执行此操作。

请参阅: