gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:17 25 4
gpt4 key购买 nike

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

在 C++11 中,如果我编码 B1B2movecopy函数(五法则),一个类 C包含它们的字段将默认自动正确复制/移动。

class C{
B1 b1; B2 b2;
};

效果很好。

问题

今天,我得到了配置文件结果+做了一些关于性能问题的测试。
主要目标:我必须做到b1b2 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的移动和复制。

在旧版本中,所有copy/move困惑只出现在B1B2 .
现在,困惑出现在每个使用数据结构的类中,如 B1B2直接。

问题

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

很遗憾没有提供MCVE。
自定义分配器和数组管理是真正难以最小化的东西。

最佳答案

改善数据局部性的一种可能性是从 vectorstructstructvector秒。而不是

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

使用一个

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

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

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

关于c++ - 使 2 个非静态字段(即动态数组)使用彼此靠近的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46150921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com