[英]How to efficiently create D3D Buffer from std::deque
众所周知, std::deque< T >
由数据块(数组数组或数组列表,我不知道)组成。 如果T
的大小足够小,则通常创建的每个块的大小为4k。 (我相信) libc ++和libstdc ++是正确的(如果我错了,请纠正我)。 4k是x86 / x64平台的页面大小(我相信)。
我一个接一个地收集数据,并将其存储到std::deque
。 最后,我应该使用其API将其传递给DirectX缓冲区。
我是否可以访问std::deque
各个块,以一次将它们一次加载(没有实现细节文件),但不能一一加载T
类型的值?
拥有这样的std::deque
接口将是很棒的,它允许固有地实现所需。 假设std::unordered_{set,map}
有存储桶(没有访问权限)。 最新开发的尝试设计允许将单个节点从一个容器移动到另一个容器等。
您如何使用指针算术自己检查块? 这是一个填充std::deque
然后为每个块的开头提供迭代器的示例:
#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
int main()
{
typedef int MyType;
std::deque<MyType> myInts(10000);
//fill the array
int count = 0;
std::generate(myInts.begin(), myInts.end(), [&](){ return ++count; });
//chunks' beginnings container
std::vector<std::deque<MyType>::iterator> myIntsChunks;
myIntsChunks.push_back(myInts.begin());
for(std::deque<MyType>::iterator it = myInts.begin()+1; it != myInts.end(); it++)
{
if(&(*(it-1)) != ((&(*(it)))-1)) //if this element's pointer isn't right after the previous element's pointer
{
myIntsChunks.push_back(it);
}
}
std::cout<<"I found " << myIntsChunks.size() << " chunk(s)." << std::endl;
std::for_each(myIntsChunks.begin(), myIntsChunks.end(),
[&myInts](const std::deque<MyType>::iterator& it)
{
std::cout<<"Chunk starts at " << std::distance(myInts.begin(),it) << std::endl;
});
}
如果将std::deque
更改为std::vector
,则只会得到一个块!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.