是否有可能 std::vector<char> 使用选定的内存对齐方式分配内存

Is it possible to have a std::vector<char> allocate memory with a chosen memory alignment

我正在将一个进程的内存复制到 vector<char> 缓冲区中,并希望为该向量分配的内存具有比默认值更高的对齐方式。

这是因为我正在该缓冲区中寻找任意类型的模式,其中内存可以代表任何东西 - 我希望我正在寻找的任何 value/type 对都根据它的类型对齐。

也许我可以使用 'offset' 来解决这个问题,但我宁愿让我的字符缓冲区对齐。

除了创建 vector<large_type> 之外,还有什么方法可以做到这一点吗?

我可以使用 自定义分配器 来解决我的问题。

示例 boost::alignment::aligned_allocator

#include <vector>
#include <boost/align/aligned_allocator.hpp>

template <typename T>
using aligned_vector = std::vector<T, boost::alignment::aligned_allocator<T, 16>>;
// 16 bytes aligned allocation

另见 How is a vector's data aligned?

我为此目的使用了如下内容:


#include <iostream>
#include <vector>

template<typename T>
class AlignedVector {
 public:
  AlignedVector() : data_(nullptr) {}
  AlignedVector(int n)
      : char_vec_(sizeof(T)*(n+1)),
        data_(AlignedAddr(char_vec_.data())),
        size_(n) {}

  T* operator[](size_t n) { return data_[n]; }
  const T* operator[](size_t n) const { return data_[n]; }

  T* data() { return data_; }
  const T* data() const { return data_; }

  size_t size() const { return size_; }
  void resize(size_t n) {
    char_vec_.resize(sizeof(T)*(n+1));
    data_ = AlignedAddr(char_vec_.data());
    size_ = n;
  }

 private:
  static T* AlignedAddr(char* addr) {
    return (T*)(addr + sizeof(T) - ((size_t)addr % sizeof(T)));
  }

  std::vector<char> char_vec_;
  T* data_;
  size_t size_;
};

int main()
{
  AlignedVector<int[128]> vec(13);
  std::cout << (size_t)vec.data() << std::endl;
}

执行对齐的主要函数是static T* AlignedAddr(char* addr)。基本上,对于 N 元素类型的 T 数组,我们为 (N+1) 个元素分配了足够的大小,并且 return 分配区域内的最低对齐地址。

要启用 std::vector<T> 中的其他方法,需要分别使用 data_size_ 来实现它们。这对我有用,因为我通常只使用其中的几个。