我将对象存储在缓冲区中.现在我知道我不能对对象的内存布局做出假设.
如果我知道对象的整体大小,是否可以创建指向此内存的指针并在其上调用函数?
比如说我有以下课程:
[int,int,int,int,char,padding*3bytes,unsigned short int*]
1)如果我知道这个类的大小为24并且我知道它在内存中的起始位置,那么假设内存布局是不可接受的,可以将它强制转换为指针并调用此对象上的函数访问这些成员?(c ++是否知道某个成员的正确位置?)
2)如果这不安全/没有,除了使用构造函数之外还有其他任何方法,它可以获取所有参数并一次从缓冲区中拉出每个参数吗?
编辑:更改标题以使其更适合我要求的内容.
您可以创建一个构造函数来获取所有成员并分配它们,然后使用placement new.
class Foo { int a;int b;int c;int d;char e;unsigned short int*f; public: Foo(int A,int B,int C,int D,char E,unsigned short int*F) : a(A), b(B), c(C), d(D), e(E), f(F) {} }; ... char *buf = new char[sizeof(Foo)]; //pre-allocated buffer Foo *f = new (buf) Foo(a,b,c,d,e,f);
这样做的好处是甚至可以正确生成v表.但是,请注意,如果您使用它进行序列化,则无符号短整数指针在反序列化时不会指向任何有用的东西,除非您非常小心地使用某种方法将指针转换为偏移然后再返回.
this
指针上的各个方法是静态链接的,只是直接调用函数,this
它是显式参数之前的第一个参数.
使用this
指针的偏移量引用成员变量.如果对象的布局如下:
0: vtable 4: a 8: b 12: c etc...
a
将通过解除引用来访问this + 4 bytes
.