强制矢量的分配器指向特定位置

Forcing a vector's allocator to point to a specific location

本文关键字:定位 位置 分配器      更新时间:2023-10-16

我有一个简单的 c 样式缓冲区,分配了自定义对齐要求 - 64 字节大小对齐和 4096 字节地址对齐。我希望使用std::vector并对其进行分配,使其数据指针指向上述缓冲区的位置?

可能吗?如果是,那么可能的缺点是什么?我不会在其生命周期内调整矢量的大小。我被迫与vectors一起工作,别无选择。

为此使用向量可能是错误的(不好的做法( - 即使 vector 可能只分配一次,即使您编写了自定义分配器 - 因为您希望缓冲区是静态的并且不应该移动。此外,向量应该拥有内存并在自身之后清理(释放((其中,正如您声明元素的内存已预先分配的那样(,因此向量似乎不适合容器开始。

强制转换为对齐的指针类型并使用spanc++20

当你有c ++ 20时,你基本上可以使用span作为你的"数组视图"。 在此之前,只需使用对齐类型并强制转换为该类型。

#include <iostream>
#include <type_traits>
#include <utility>
#include <span>

struct alignas(0x1000) Mine {
unsigned char a[64];
};

typename std::aligned_storage<sizeof(unsigned char[64]), 0x1000>::type mem_seg[10]; //<-- or your own allocated storage
int main() {
std::cout << "size: " << sizeof(Mine) << std::endl;
std::cout << "alignment: " << alignof(Mine) << std::endl;
Mine* begin_ = reinterpret_cast<Mine*>(&mem_seg);
Mine* end_ = reinterpret_cast<Mine*>(&mem_seg) + 10;
//pre-c++20 you done, work with the pointers 'normally'
//c++20 gives you span: (an array view of sorts)
//that works a lot like a normal container (except it's fixed size)
std::span<Mine> mine_view(begin_, end_);

for(auto& e : mine_view) {
std::cout << "address check: " << &e << std::endl;
}
return 0;
}

https://godbolt.org/z/H3BDof

上面打印以下内容(示例(:

size: 4096
alignment: 4096
address check: 0x604000
address check: 0x605000
address check: 0x606000
address check: 0x607000
address check: 0x608000
address check: 0x609000
address check: 0x60a000
address check: 0x60b000
address check: 0x60c000
address check: 0x60d000