是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存
Is it possible to have a std::vector<char> allocate memory with a chosen memory alignment
我正在vector<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_
来实现它们。这对我有用,因为我通常只使用其中的几个。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配