我在vector<char>
缓冲区中复制进程的内存,并希望为此向量分配的内存具有比默认值更高的对齐。
这是因为我在缓冲区中寻找任意类型的模式,其中内存可以代表任何东西 - 我希望我正在寻找的任何值/类型对根据它的类型进行对齐。
也许我可以使用'offset'解决这个问题,但我宁愿让我的char缓冲区对齐。
有没有办法做到这一点,而不是创建一个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
我为此目的使用了类似的东西:
#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_
来实现它们。这对我有用,因为我通常只使用其中的一些。