mat*_*ler 0 c++ memory oop memcpy
当我用c ++做sizeof时,我一定会得到"整个对象"吗?我问,因为我要使用memcpy将对象复制到其他内存区域(从一开始可能是一个愚蠢的想法,对吧?).
我担心的是,我可能无法获得整个对象,但只有属于该类的部分现在才能获得.它有意义还是我感到困惑?
编辑示例
class A{ public: int a = 123; };
class B: public A{ public: int b = 321; };
class C : public B{ public: int c = 333; };
C c_ = C();
B b_ = C();
A a_ = C();
std::cout << sizeof(a_) << " , " << sizeof(b_) << " , " << sizeof(c_) << std::endl;
Run Code Online (Sandbox Code Playgroud)
似乎给了我4,8,12.
我想我需要做动态转换来弄清楚如何获得我在每种情况下构建为"C"类的"整体"对象?
sizeof将始终返回对象的静态大小.请注意,在您的示例中,它将与真实对象大小一致,因为没有多态性; 当你这样做
A a = B();
Run Code Online (Sandbox Code Playgroud)
a 是类型的A- 你恰好A用一个新B对象初始化一个新对象,这导致切片(a用B()常见的字段初始化A).
一个更好的例子是:
B b;
A *a = &b;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,*a确实会是动态类型B,但sizeof(*a)仍会返回sizeof(A),而不是sizeof(B).
有几种方法可以获得对象的动态大小:
return sizeof(*this);在所有派生类中执行并重新定义它.话虽这么说,这最后一个方法不会特别有用,因为做memcpy多平面类等非平凡类型是未定义的行为(所以即使是第一种方法也是如此,因为我想你会想要这样做多态类型).
复制多态类问题的常见方法是接受这样一个事实:它们必须存在于堆中并定义在每个派生类clone()中执行的方法virtual A * clone() {return new B(*this);}(在哪里B是派生类),并clone()在需要副本时调用.
请注意,你可以拉出更微妙的技巧; 一旦我有一个类层次结构,它有一个虚拟方法调度到new每个派生类的一个位置,一个用于析构函数,但你真的必须知道你在做什么(在我的情况下,我在一个union包含一个实例的每一个上调用它们)派生类,所以大小和对齐不是问题).
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |