gpt4 book ai didi

C++ 访问不属于对象本身的内存

转载 作者:行者123 更新时间:2023-11-30 04:33:41 25 4
gpt4 key购买 nike

我猜这听起来很奇怪,但我正在为硬件设备创建一些低级代码。根据具体情况,我需要分配比实际结构需要更多的空间,在那里存储信息并将对象本身的地址传递给调用者。

当用户释放这样一个对象时,我需要在实际释放该对象之前阅读这些信息。

目前,我正在使用简单的指针操作来获取地址(类地址或额外空间地址)。但是,我认为如果我在内部 (!) 类型的成员函数中进行指针运算会更容易理解。处理地址的分配器是唯一知道这种内部类型的分配器。换句话说,返回给用户的类型是不同的。

下面的例子说明了我的意思:

struct foo
{
int& get_x() { return reinterpret_cast<int*>(this)[-2]; }
int& get_y() { return reinterpret_cast<int*>(this)[-1]; }

// actual members of foo

enum { size = sizeof(int) * 2 };
};


int main()
{
char* p = new char[sizeof(foo) + foo::size];
foo* bar = reinterpret_cast<foo*>(p + foo::size);

bar->get_x() = 1;
bar->get_y() = 2;

std::cout << bar->get_x() << ", " << bar->get_y() << std::endl;

delete p;
return 0;
}

这样做有争议吗?

最佳答案

这样做似乎不必要地复杂。如果我要实现这样的东西,我会采用更简单的方法:

#pragma pack(push, 1)
struct A
{
int x, y;
};

struct B
{
int z;
};
#pragma pack(pop)

// allocate space for A and B:
unsigned char* data = new char[sizeof(A) + sizeof(B)];

A* a = reinterpret_cast<A*>(data);
B* b = reinterpret_cast<B*>(a + 1);

a->x = 0;
a->y = 1;
b->z = 2;

// When deallocating:
unsigned char* address = reinterpret_cast<unsigned char*>(a);

delete [] address;

此实现略有不同,但(在我看来)更容易理解,并且不依赖于对存在或不存在的深入了解。如果指针的所有实例都被分配为 unsigned char 并被删除,则除了 block 中的第一个地址之外,用户不需要跟踪特定的内存地址。

关于C++ 访问不属于对象本身的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582927/

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