使2个非静态字段(即动态数组)使用彼此靠近的内存

时间:2017-09-11 08:06:25

标签: c++ memory-management c++14 rule-of-three

B1B2成为动态大小的存储类 (例如B1~std::vector<char> B2~std::vector<float>

在C ++ 11中,如果我编写B1B2&#39; s movecopy函数(规则为5),则编写一个类{{ 1}}包含它们的字段将默认正确地复制/移动自动

C

效果非常好。

问题

今天,我得到了个人资料结果+对性能问题进行了一些测试 主要目标:我必须让class C{ B1 b1; B2 b2; }; b1的{​​{1}}相同的实例分配内存: -

b2

如果可以的话,整个节目的性能提升10-20%。

我糟糕的解决方案

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

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混乱只会出现在copymove中。
现在,混乱出现在每个使用B1B2等数据结构的类中。

问题

什么是C ++技术/设计模式/习语可以提供帮助? 要回答,不需要可运行的代码。伪代码或仅 概念 就足够了。

我很遗憾没有提供MCVE 自定义分配器和数组管理是最难以最小化的事情。

1 个答案:

答案 0 :(得分:1)

改善数据局部性的一种可能性是从struct vectorvector struct s。而不是

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

使用

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

这样,数据总是存储在一起,您不需要修改自定义分配器。这是否适用于您的情况主要取决于两个条件:

  • 是否有必要让所有char(或int)连续?例如。因为定期调用API需要相应类型的vector
  • 存储的charint的数量是否相等(至少几乎相等)?