What is the recommended way to align memory in C++11

前端 未结 4 586
难免孤独
难免孤独 2020-12-02 05:50

I am working on a single producer single consumer ring buffer implementation.I have two requirements:

  1. Align a single heap allocated instance of a ring buffer to
4条回答
  •  栀梦
    栀梦 (楼主)
    2020-12-02 06:09

    Unfortunately the best I have found is allocating extra space and then using the "aligned" part. So the RingBuffer new can request an extra 64 bytes and then return the first 64 byte aligned part of that. It wastes space but will give the alignment you need. You will likely need to set the memory before what is returned to the actual alloc address to unallocate it.

    [Memory returned][ptr to start of memory][aligned memory][extra memory]
    

    (assuming no inheritence from RingBuffer) something like:

    void * RingBuffer::operator new(size_t request)
    {
         static const size_t ptr_alloc = sizeof(void *);
         static const size_t align_size = 64;
         static const size_t request_size = sizeof(RingBuffer)+align_size;
         static const size_t needed = ptr_alloc+request_size;
    
         void * alloc = ::operator new(needed);
         void *ptr = std::align(align_size, sizeof(RingBuffer),
                              alloc+ptr_alloc, request_size);
    
         ((void **)ptr)[-1] = alloc; // save for delete calls to use
         return ptr;  
    }
    
    void RingBuffer::operator delete(void * ptr)
    {
        if (ptr) // 0 is valid, but a noop, so prevent passing negative memory
        {
               void * alloc = ((void **)ptr)[-1];
               ::operator delete (alloc);
        }
    }
    

    For the second requirement of having a data member of RingBuffer also 64 byte aligned, for that if you know that the start of this is aligned, you can pad to force the alignment for data members.

提交回复
热议问题