gpt4 book ai didi

c++ - 强制 vector 的分配器指向特定位置

转载 作者:行者123 更新时间:2023-11-28 04:07:23 28 4
gpt4 key购买 nike

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

这可能吗?如果是,那么可能的缺点是什么?我不会在其生命周期内调整 vector 的大小。我被迫使用 vectors 并且别无选择。

最佳答案

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

转换为对齐指针类型并使用span

当/如果你有 您基本上可以使用 span 作为“数组 View ”。在此之前,只需使用对齐类型并转换为该类型即可。

#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

关于c++ - 强制 vector 的分配器指向特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58480426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com