c++ - 在两个相同类的指针之间进行转换的安全性?

标签 c++ pointers casting

假设我有两个不同的类,它们都以相同的内部方式表示 2D 坐标数据,如下所示:

class LibA_Vertex{
    public:
    // ... constructors and various methods, operator overloads
    float x, y
};

class LibB_Vertex{
    public:
    // ... same usage and internal data as LibA, but with different methods
    float x, y
};


void foobar(){
    LibA_Vertex * verticesA = new LibA_Vertex[1000];
    verticesA[50].y = 9;
    LibB_Vertex * verticesB = reinterpret_cast<LibB_Vertex*>( vertexA );
    print(verticesB[50].y); // should output a "9"
};

鉴于这两个类是相同的且具有上述功能,我能否可靠地指望这种指针转换在每种情况下都按预期工作?

(背景是我需要一种简单的方法在两个具有相同顶点类的独立库之间交换顶点数组,并且我想避免不必要地复制数组)。

最佳答案

C++11 添加了一个称为布局兼容的概念,适用于此。

Two standard-layout struct (Clause 9) types are layout-compatible if they have the same number of non-static data members and corresponding non-static data members (in declaration order) have layout-compatible types (3.9).

在哪里

A standard-layout class is a class that:

  • has no non-static data members of type non-standard-layout class (or array of such types) or reference,
  • has no virtual functions (10.3) and no virtual base classes (10.1),
  • has the same access control (Clause 11) for all non-static data members,
  • has no non-standard-layout base classes,
  • either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
  • has no base classes of the same type as the first non-static data member.

A standard-layout struct is a standard-layout class defined with the class-key struct or the class-key class.

A standard-layout union is a standard-layout class defined with the class-key union.

最后

Pointers to cv-qualified and cv-unqualified versions (3.9.3) of layout-compatible types shall have the same value representation and alignment requirements (3.11).

这保证了 reinterpret_cast 可以将指向一种类型的指针转​​换为指向任何布局兼容类型的指针。

关于c++ - 在两个相同类的指针之间进行转换的安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7762929/

相关文章:

c++ - 需要帮助将包含整数的文件读入数组

c - 返回 Void 指针并将 Hex 转换为 UINT

pointers - 如何以字节为单位获取指针偏移量?

java - 括号中的类型名称是什么意思?

c++ - 退出应用程序并在 MFC 中返回代码

C++最佳实践: Returning reference vs.对象

c++ - 如何在 C++ 中发送 2 个 TCP 数据包

pointers - 指向指针的指针有什么用?

c++ - C++ 中的转换何时改变值的位?

java - 为什么此转换不会返回正确的方法? (以弗软件)