【问题标题】:How to efficiently create D3D Buffer from std::deque如何从 std::deque 高效地创建 D3D 缓冲区
【发布时间】:2017-08-08 18:11:21
【问题描述】:

众所周知,std::deque< T > 由数据块组成(数组数组或数组列表,我不知道)。如果T 的大小足够小,则通常创建的每个块的大小为 4k。 (我相信)libc++libstdc++ 是正确的(如果我错了,请纠正我)。 4k 是 x86/x64 平台的页面大小(我相信)。

我一一收集数据并将其存储到std::deque。最后,我应该使用它的 API 将它传递给 DirectX 缓冲区。

我是否可以访问 std::deque 的各个块以一次加载它们(没有实现细节文件),但不能一一加载 T 类型的值?

如果有std::deque这样的接口就太好了,它可以实现固有的期望。比如说,std::unordered_{set,map} 有存储桶(无法访问它们)。新开发的尝试设计允许将单个节点从一个容器移动到另一个容器等。

【问题讨论】:

    标签: c++ memory directx deque


    【解决方案1】:

    您如何使用指针算法自己检查块?下面是一个填充 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,您将只得到一个块!

    【讨论】:

    • 您需要附加 myInts.end() 以保持通用性。这是“代理”容器的一般模式。
    • @Orient 我在开头附加myInts.begin() 以包含第一个块。 end() 不是双端队列的一部分,也不是块。我认为取消引用块中的每个元素是安全的,并通过添加不再是这种情况的整数。我想这取决于您要遵循的约定。
    • 但我需要复制元素的范围。或指向第一个元素 +(当前)块大小的指针。鉴于myIntsChunks,我可以获得除最后一个之外的所有块大小。案例中的最后一个是特殊情况。因此需要特殊处理。 “保持通用”对于这笔小额付款是相当大的收购。
    • 您的解决方案也是N,但也可以是log(N) * M,其中M 是块数。
    • @Orient 我仍然可以想到添加end() 的利弊。我将保持示例简单。还有关于性能,这只是我2分钟写的一个例子。随意优化它:)
    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多