代码之家  ›  专栏  ›  技术社区  ›  cppBeginner

使两个非静态字段(即动态数组)在彼此附近使用内存

  •  2
  • cppBeginner  · 技术社区  · 8 年前

    允许 B1 B2 是一个动态大小的存储类。
    (例如。 B1~std::vector<char> B2~std::vector<float> )

    地下一层 move copy 函数(五法则),一个类 C

    class C{
        B1 b1; B2 b2;
    };
    

    它工作得很好。

    问题


    主要目标: 我必须 b1 b2 C

    b1[0]  b1[1] ... b1[b1.size-1] (minimum gap) b2[0]  b2[1] ... b2[b2.size-1] 
    

    我糟糕的解决方案

    我可以使用这样的自定义分配器(伪代码):-

    class C{
        B1 b1; 
        B2 b2;
        Allocator* allo_; // can be heap allocator 
        public: void reserve(int size){
            //old : b1.reserve(size); b2.reserve(size);  .... so easy
            //new :-
            B1 b1Next; B2 b2Next;
            int nb1=b1Next.howMuchIWant(size); 
            int nb2=b2Next.howMuchIWant(size);
            //^ request amount of bytes needed if capacity="size"
            void* vPtr=allo_->allocate(nb1+nb2);
            b1Next.setMemory(vPtr);
            b2Next.setMemory(vPtr + nb1);  //add "vPtr" by "nb1" bytes
            b1Next=b1;   //copy assignment (not move memory)
            b2Next=b2;   //copy assignment (not move memory)
            b1=std::move(b1Next);   //move memory
            b2=std::move(b2Next);   //move memory 
            //clean up previous "vPtr" (not shown)
        }
    };
    

    C 的移动和复制。

    在旧版本中,所有 / 移动 混乱只出现在 地下一层 地下二层 .
    地下一层 直接地

    有哪些C++技术/设计模式/习惯用法可以帮助您?
    要回答这个问题,不需要可运行的代码。伪代码或只是一个 概念 就够了。


    自定义分配器和阵列管理对于最小化来说非常困难。

    1 回复  |  直到 8 年前
        1
  •  1
  •   nh_    8 年前

    改善数据局部性的一种可能性是从 struct 属于 vector 矢量 属于 结构

    struct S
    {
        std::vector<char> c;
        std::vector<int> i;
    };
    S data;
    

    使用

    struct S
    {
        char c;
        int i;
    };
    std::vector<S> data;
    

    • 有必要拥有全部吗 char (或 int )连续?E、 g.因为API是定期调用的,需要 各自类型。
    • 是存储的 烧焦 相等(至少接近相等)?
    推荐文章