如何正确地转换数据开始指针(这甚至是一种好习惯)?
How to correctly typecast a data begin pointer (and is it even good practice)?
考虑一个行优先、4 通道、8 位图像。我想将数据逐个像素地传输到另一个同样大小的图像。因为我每个像素有 4*8=32 位,所以我想在 int
上使用赋值 operator=
一次,而不是像 memcpy()
这样的替代方法或使用赋值 operator=
在 4 个无符号字符上(数据的实际布局)。
我有以下代码但有一个问题:
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;
是对数据指针进行类型转换的正确方法吗?
结论:
-Memcpy() and
-typecasting data pointers into char* and then using assignment
在行为(复制原始内存)和此问题的解决方案上是等效的。但是将原始内存类型转换为另一种类型 (甚至像 int 这样的内部类型),然后使用赋值运算符是特定于平台的,因此是未定义的行为。
我认为您这样做会触发未定义的行为。我建议您单独分配每个组件(我假设为 4 unsigned char
个值),并依靠您的编译器高效地执行此操作。
参见:
- What is the strict aliasing rule?
- Strict aliasing rule and 'char *' pointers
考虑一个行优先、4 通道、8 位图像。我想将数据逐个像素地传输到另一个同样大小的图像。因为我每个像素有 4*8=32 位,所以我想在 int
上使用赋值 operator=
一次,而不是像 memcpy()
这样的替代方法或使用赋值 operator=
在 4 个无符号字符上(数据的实际布局)。
我有以下代码但有一个问题:
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;
是对数据指针进行类型转换的正确方法吗?
结论:
-Memcpy() and
-typecasting data pointers into char* and then using assignment
在行为(复制原始内存)和此问题的解决方案上是等效的。但是将原始内存类型转换为另一种类型 (甚至像 int 这样的内部类型),然后使用赋值运算符是特定于平台的,因此是未定义的行为。
我认为您这样做会触发未定义的行为。我建议您单独分配每个组件(我假设为 4 unsigned char
个值),并依靠您的编译器高效地执行此操作。
参见:
- What is the strict aliasing rule?
- Strict aliasing rule and 'char *' pointers