c++ - 如何正确地转换数据开始指针(这甚至是一种好习惯)?

标签 c++ casting

考虑一个行优先、4 channel 、8 位图像。我想将数据逐个像素地传输到另一个同样大小的图像。因为每个像素有 4*8=32 位,所以我想使用赋值 operator=int 上一次,而不是像 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 值),并依靠您的编译器高效地执行此操作。

参见:

关于c++ - 如何正确地转换数据开始指针(这甚至是一种好习惯)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769886/

相关文章:

c++ - 在信号处理程序中使用互斥体

C++ 字符串和重载运算符

c++ - 模板类的转换

基于返回类型的 Java 泛型转换?

c++ - 为什么 C++ 将指针和指针数组视为同一事物?

c++ - 从 C++ 文件中快速读取特定单词

c++ - 转换为 HWND 时发出警告

c - 16 字节无符号字符数组作为数字?

c++ - 奇怪的类型转换行为

c++ - 访问 "parent"或 "owner"函数 C++