让B1
和B2
成为动态大小的存储类
(例如B1~std::vector<char>
B2~std::vector<float>
)
在C ++ 11中,如果我编写B1
和B2
&#39; s move
和copy
函数(规则为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
混乱只会出现在copy
和move
中。
现在,混乱出现在每个使用B1
和B2
等数据结构的类中。
什么是C ++技术/设计模式/习语可以提供帮助? 要回答,不需要可运行的代码。伪代码或仅 概念 就足够了。
我很遗憾没有提供MCVE 自定义分配器和数组管理是最难以最小化的事情。
答案 0 :(得分:1)
改善数据局部性的一种可能性是从struct
vector
到vector
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
。char
和int
的数量是否相等(至少几乎相等)?