作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将对象存储在缓冲区中。现在我知道我不能对对象的内存布局做出假设。
如果我知道对象的整体大小,是否可以创建指向该内存的指针并在其上调用函数?
例如说我有以下类(class):
[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-table 也能正确生成。但是请注意,如果您使用它进行序列化,则在反序列化时,unsigned short int 指针不会指向任何有用的东西,除非您非常小心地使用某种方法将指针转换为偏移量然后再返回.
this
指针上的各个方法是静态链接的,只是对函数的直接调用,this
是显式参数之前的第一个参数。
成员变量是使用 this
指针的偏移量来引用的。如果一个对象是这样布局的:
0: vtable
4: a
8: b
12: c
etc...
a
将通过取消引用 this + 4 bytes
来访问。
关于c++ - 在缓冲区中管理 C++ 对象,考虑对齐和内存布局假设,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/417446/
我是一名优秀的程序员,十分优秀!