使2个非静态字段(即动态数组)相互接近使用内存
Make 2 non-static fields (that are dynamic arrays) use memory near each other
令B1
和B2
为动态大小的存储类。
(例如B1~std::vector<char>
B2~std::vector<float>
)
在C 11中,如果我代码B1
和B2
'S move
和copy
函数(五个规则),则包含它们的类C
将以字段为单位,默认情况下正确复制/移动自动自动复制/移动。
class C{
B1 b1; B2 b2;
};
它的工作非常好。
问题
今天,我得到了个人资料结果 对性能问题进行了一些测试。
主要目标:我必须制作C
同一实例的b1
和b2
彼此分配内存: -
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
杂物仅出现在B1
和B2
中。
现在,混乱出现在每个使用B1
和B2
等数据结构的类中。
问题
什么是可以帮助您的C 技术/Design-Pattern/IDIOM?
要回答,不需要可运行的代码。伪代码或仅概念就足够了。
我很遗憾不提供MCVE。
自定义分配器和数组管理确实是最小化的很难。
提高数据局部性的一种可能性是从vector
s的struct
到struct
s的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
)连续?例如。因为定期称为API,需要相应类型的vector
。 - 存储的
char
和int
的数量相等(至少几乎相等)?
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 查找最接近的大于当前数字的数字的索引
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 使2个非静态字段(即动态数组)相互接近使用内存