当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《考虑对齐和内存布局假设,在缓冲区中管理C++对象》经验,为你挑选了1个好方法。

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

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

比如说我有以下课程:

[int,int,int,int,char,padding*3bytes,unsigned short int*]

1)如果我知道这个类的大小为24并且我知道它在内存中的起始位置,那么假设内存布局是不可接受的,可以将它强制转换为指针并调用此对象上的函数访问这些成员?(c ++是否知道某个成员的正确位置?)

2)如果这不安全/没有,除了使用构造函数之外还有其他任何方法,它可以获取所有参数并一次从缓冲区中拉出每个参数吗?

编辑:更改标题以使其更适合我要求的内容.



1> Eclipse..:

您可以创建一个构造函数来获取所有成员并分配它们,然后使用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.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有