C++ 如何从具有较低对齐保证的api分配对齐内存?

C++ 如何从具有较低对齐保证的api分配对齐内存?,c++,alignment,C++,Alignment,如果我有一个API来分配内存,它保证返回的指针与n个字节对齐,那么我如何分配分配给m>n个字节的内存(仅考虑对齐时2的非负整数幂) 我的尝试是: void* alloc(size_t bytes, size_t alignment) { if(alignment > DEFAULT_GUARANTEE) { bytes += aligment - DEFAULT_GUARANTEE; } void* ptr = existing_alloc(bytes); uint

如果我有一个API来分配内存,它保证返回的指针与n个字节对齐,那么我如何分配分配给m>n个字节的内存(仅考虑对齐时2的非负整数幂)

我的尝试是:

void* alloc(size_t bytes, size_t alignment) {
  if(alignment > DEFAULT_GUARANTEE) {
    bytes += aligment - DEFAULT_GUARANTEE;
  }
  void* ptr = existing_alloc(bytes);
  uintptr_t remainder = ((uintptr_t)ptr) % alignment;
  if(remainder != 0) {
    ptr = (void*)(((uintptr_t)ptr) + alignment - remainder);
  }
  return ptr;
}
那是声音吗?有更好的方法吗

那是声音吗

当原始指针头丢失时释放的能力

有更好的方法吗

从C++17开始推荐,

使用。

是的,这可能是正确的方法。但将指针塞进尺码会让我感到不舒服,而且可能是UB。我将转换为char*并以这种方式递增指针。(对于模,奇怪的强制转换应该不是问题,无论如何,您需要最低有效位,您可能希望将其标记为reinterpret_cast?)您将如何取消分配该值?我认为经典的
free
不适合被指向分配块内的偏移量。“至少在它的手册页上没有任何东西表明这一点。”德拉特尼克谁说过关于释放记忆的事?释放内存是可选的:)除此之外,您可以在分配数据的开头存储原始分配位置的偏移量,再次偏移返回的指针,然后在调用
free
之前应用此偏移量。非常确定
delete[]
也会使用这些“隐藏”字节计算出释放数组的大小。好吧,我正在使用Windows HeapAlloc(它只保证8字节对齐)实现对对齐新数组的替换,所以我不能使用对齐的allocf,即“Windows”,你实际上是说“MSVC”,这里有对齐的malloc函数。这已经有一段时间了。我更喜欢使用它(以及其他实现提供的分配器),并通过预处理器goop在它们之间进行选择,而不是重新实现。@user1282931如果
HeapAlloc()
和Windows对这个问题至关重要,那么从一开始就应该将它们包括在其中,以节省我们所有的时间。否则这个问题就会变成一个移动的目标。@chux,为什么?这个问题非常普遍,适用于所有提供低于所需对齐度的APIalignment@user1282931指针和对齐的本质不是可以在C代码中移植的<代码>((uintpttr_t)ptr)%alignment采用特定的内存模型。相反,该功能需要一个低于C所能实现的实现。为此,正如@SoronelHaetir所建议的,尽可能使用实现提供的分配器是最好的方法。