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

时间:2019-03-17 17:00:24

标签: c++ vector memory-alignment

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

这是因为我正在内存中可以表示任何内容的缓冲区中寻找任意类型的模式-我希望我正在寻找的任何值/类型对都可以根据其类型进行对齐。

也许我可以使用'offset'解决此问题,但我希望将char缓冲区对齐。

除了创建vector<large_type>之外,还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

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

带有override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { ... recyclerView = v.findViewById(R.id.recylerItemCart) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = RecyclerItemCart(cart.elements, activity) { //this is the lambda (listener) that you pass to the adapter, // and this will be called when long click occurs on itemView as it has already set in ViewHolder } ... return v }

的示例
boost::alignment::aligned_allocator

另请参阅How is a vector's data aligned?

答案 1 :(得分:0)

我为此使用了以下内容:


#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)个元素分配足够的大小,并返回分配区域内的最低对齐地址。

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