继承对象上指针算术的安全性
Safety of pointer arithmatic on inherited objects
如果我们有以下代码:
struct Base
{
int x;
int y;
void foo();
virtual unsigned getCrc() = 0;
};
struct Derived1 : public Base
{
int a;
int b;
unsigned getCrc();
};
struct Derived2 : public Base
{
float a;
float b;
unsigned getCrc();
};
内存中a
和b
应该在x
和y
之后,这是C++标准吗?或者它是排列继承的对象的最常用的方法?(即编译器实际标准)。
换句话说,我可以保证:
Derived1 obj;
int* unsafe_internal_a = (int*)((unsigned)(&obj) + sizeof(Base));
编辑:我的问题是"内存布局是否包含在某些标准中?"?或者它依赖于编译器?"。代码仅用于说明。
问题的答案是:它们在某些情况下依赖于编译器,而在其他情况下则不依赖。中的详细信息
如果您需要从类中提取数据,并将其压缩为最小格式,我建议为它们实现一组序列化/反序列化方法。如果你只是想弄清楚c++的作用,那么这个链接的问题应该会有很大帮助。
这将是更安全的
size_t off = offsetof( Derived1, a );
Derived1 obj;
unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off);
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- 避免使用指针时C++的性能和安全性
- 在 void 指针中存储整数的往返安全性
- 通过在C 中动态加载的LIB分配的基础级指针上调用删除的安全性
- 是从指针的矢量到常量指针的矢量的重新解释强制转换的安全性
- 从基析构函数static_cast指向派生类的指针的安全性
- 指向STL容器线程安全性(队列/取消队列)的指针
- C++ - 通过指针访问矢量元素的安全性
- 使用指向对象的void *指针的安全性
- 继承对象上指针算术的安全性
- 指针到原语的reinterpret_cast的安全性