gpt4 book ai didi

c++ - 具有动态分配成员的动态创建对象的访问成本

转载 作者:搜寻专家 更新时间:2023-10-31 01:59:34 25 4
gpt4 key购买 nike

我正在构建一个应用程序,它将具有 A 类型的动态分配对象,每个对象都有一个动态分配的成员 (v),类似于下面的类

class A {
int a;
int b;
int* v;
};

哪里:

  • v 的内存将在构造函数中分配。
  • v 将在创建类型 A 的对象时分配一次,并且永远不需要调整大小。
  • v 的大小在 A 的所有实例中都不同。

应用程序可能会拥有大量此类对象,并且大多需要通过 CPU 流式传输大量此类对象,但只需要对成员变量执行非常简单的计算。

  • 动态分配 v 是否意味着 A 的实例及其成员 v 不在内存中?
  • 可以使用哪些工具和技术来测试这种碎片化是否是性能瓶颈?
  • 如果这种碎片是一个性能问题,是否有任何技术可以让 A 和 v 分配到连续的内存区域?
  • 或者是否有任何技术可以帮助内存访问,例如预取方案?例如获取类型 A 的对象,在预取 v 的同时对其他成员变量进行操作。
  • 如果在编译时可以知道 v 的大小或可接受的最大大小,将 v 替换为固定大小的数组(如 int v[max_length])会带来更好的性能吗?

目标平台是配备 x86/AMD64 处理器、Windows 或 Linux 操作系统并使用 GCC 或 MSVC 编译器编译的标准台式机。

最佳答案

如果您有充分的理由关心性能...

Could having v dynamically allocated could mean that an instance of A and its member v are not located together in memory?

如果他们都分配了'new',那么他们很可能会彼此靠近。然而,当前的内存状态会极大地影响这个结果,这在很大程度上取决于你对内存所做的事情。如果只是依次分配一千个这样的东西,那么后面的几乎肯定是“近乎连续”的。

如果 A 实例在堆栈上,则它的“v”极不可能在附近。

If such fragmentation is a performance issue, are there any techniques that could allow A and v to allocated in a continuous region of memory?

为两者分配空间,然后将它们放入该空间。它很脏,但通常应该可以工作:

char* p = reinterpret_cast<char*>(malloc(sizeof(A) + sizeof(A::v)));
char* v = p + sizeof(A);
A* a = new (p) A(v);

// time passes

a->~A();
free(a);

Or are there any techniques to aid memory access such as pre-fetching scheme?

预取是特定于编译器和平台的,但许多编译器都具有可用于执行此操作的内部函数。请注意 - 如果您打算立即尝试访问该数据,这将无济于事,因为要使预取具有任何值(value),您通常需要在需要数据之前进行数百个周期。也就是说,它可以巨大提高速度。内部函数看起来像 __pf(my_a->v);

If the size of v or an acceptable maximum size could be known at compile time would replacing v with a fixed sized array like int v[max_length] lead to better performance?

也许吧。如果固定大小的缓冲区通常接近您需要的大小,那么它可能会大大提高速度。以这种方式访问​​一个 A 实例总是会更快,但是如果缓冲区过大且大部分未使用,您将失去将更多对象装入缓存的机会。 IE。缓存中有更多较小的对象比有大量未使用的数据填满缓存要好。

具体取决于您的设计和性能目标。关于这个的有趣讨论,在使用特定编译器的特定硬件上有一个“现实世界”的特定问题,请参阅 The Pitfalls of Object Oriented Programming (这是 PDF 的 Google 文档链接,PDF 本身可以在 here 中找到)。

关于c++ - 具有动态分配成员的动态创建对象的访问成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909515/

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