c++ - 如何使用 header 对象在 malloc 内存中安全地构造 C++ 对象

标签 c++ memory

我想在另一个分配器(通常在内部调用 realloc)返回的内存中构造任意 C++ 对象。我知道在 malloc 的内存中做一个新的放置通常是可以的。但是,我希望所有 C++ 对象在连续分配的内存中都有另一个公共(public)对象。此 header 对象将包含有关以下 C++ 对象的信息。从对齐的角度来看,我不知道分配 (sizeof(header) + sizeof(type)) 内存然后在 (mem + sizeof(header)) 处构造类型是否安全。我认为这不是因为 (mem + sizeof(header)) 不能保证正确对齐类型。

我已经考虑了一些可能性,例如生成一个模板类型,该模板类型声明头后跟类型 T 并分配 sizeof(ObjPlusHeader<T>) .但是,问题是该结构将作为 void* 出现在我的代码的另一部分中(由我无法控制的外部库强制执行),因此我必须知道将其转换为什么。我想转换为 Header* 而不是 ObjectPlusHeader<???>* .

我知道使用标准布局类型,我可以将对象转换为指向其第一个成员的指针。但是,T 不一定是标准布局,在这种情况下 ObjectPlusHeader<T>即使 Header 是,也不会是标准布局。我还考虑过让包装器模板从 Header 公开派生,从 T 私下派生而不是包含 T。但是,将 void* 直接转换为 Header* 而不首先转换为存储的实际类型仍然是不合法的我不会知道的。

我想要的是由分配器(基本上是 realloc)分配的连续内存,我知道 Header 位于开头,并且任意 C++ 对象跟随在我知道并且可以存储在 Header 中的某个正确对齐的地址 >= mem + sizeof(Header) .所以给定 void* 我可以将它转换为 Header* 并获取对象。但是,我不确定潜在的对齐问题。

最佳答案

只需编写一个 (constexpr) 函数来计算正确的填充:

template<typename T>
size_t paddingAfterHeader() {
   auto rem = sizeof(Header)%alignof(T);
   return rem ? alignof(T) - rem : 0; 
}

分配:
void *mem = malloc( sizeof( Header ) + paddingAfterHeader<T>() + sizeof(T) );

关于c++ - 如何使用 header 对象在 malloc 内存中安全地构造 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40409689/

相关文章:

c++ - 从 sscanf 中提取数据

c++ - C++- vector <class>和std::bad_alloc

c - 堆管理器的空闲列表存储在进程地址空间的什么位置?

javascript - 高效地声明 JavaScript 变量

c - DOS/4GW fatal error (1307) : not enough memory

c++ - 在 std::vector 上的 Visual Studio 2012 express 中的自动矢量化没有发生

c++ - 通过Qt5中的uart发送大缓冲区

c++ - 在一个类中测试许多数学运算

flash - Adobe AIR 可以使用的最大内存量是多少?

c++ - 为什么bool和_Bool在内存中占用1个字节只能存0或1?