让B1
和B2
成为一个动态大小的存储类。
(例如B1~std::vector<char>
B2~std::vector<float>
)
在 C++11 中,如果我编写B1
andB2
和函数(五规则),包含它们作为字段的类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]
如果可以的话,我会让整个程序的性能提升 10-20%。
我的糟糕解决方案
我可以使用这样的自定义分配器(伪代码):-
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
移动和复制了。
在旧版本中, all copy
/ move
mess 只出现在B1
and中B2
。
现在,混乱出现在每个直接使用数据结构的类B1
中B2
。
问题
什么是可以提供帮助的 C++ 技术/设计模式/习语?
要回答,不需要可运行的代码。伪代码或只是一个概念就足够了。
我很遗憾没有提供 MCVE。
自定义分配器和数组管理是非常难以最小化的事情。