强制矢量的分配器指向特定位置
Forcing a vector's allocator to point to a specific location
我有一个简单的 c 样式缓冲区,分配了自定义对齐要求 - 64 字节大小对齐和 4096 字节地址对齐。我希望使用std::vector
并对其进行分配,使其数据指针指向上述缓冲区的位置?
可能吗?如果是,那么可能的缺点是什么?我不会在其生命周期内调整矢量的大小。我被迫与vectors
一起工作,别无选择。
为此使用向量可能是错误的(不好的做法( - 即使 vector 可能只分配一次,即使您编写了自定义分配器 - 因为您希望缓冲区是静态的并且不应该移动。此外,向量应该拥有内存并在自身之后清理(释放((其中,正如您声明元素的内存已预先分配的那样(,因此向量似乎不适合容器开始。
强制转换为对齐的指针类型并使用span
c++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
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 是与初始类同一内存位置的重新定位类
- 如何在使用网格布局时重叠qwidgets,并将重叠的widget定位在距离窗口边界特定距离的位置
- 我不知道如何定位最高随机数的位置
- 如何在MFC上设置窗口位置以将其定位到屏幕顶部
- 将QGraphicsSvgItem的中心定位在一个位置上。
- 如何定位WinRT异步方法调用中出现错误的位置
- 重定位表项在平面二进制文件中的存储位置