gpt4 book ai didi

c++ - 在缓冲区中管理 C++ 对象,考虑对齐和内存布局假设

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:06:28 25 4
gpt4 key购买 nike

我将对象存储在缓冲区中。现在我知道我不能对对象的内存布局做出假设。

如果我知道对象的整体大小,是否可以创建指向该内存的指针并在其上调用函数?

例如说我有以下类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com