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-keyclass
.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 – 两个相同类的指针之间的铸造安全性?全部内容,希望文章能够帮你解决c – 两个相同类的指针之间的铸造安全性?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)