引用成员的长序列的效率

Efficiency of long sequences of reference members

本文关键字:效率 成员 引用      更新时间:2023-10-16

假设我有一些这样的类:

class A
{
public:
    int data;
};
class B
{
public:
    A& a;
    B(A& x) : a(x) {}
};
class C
{
public:
    B& b;
    C(B& x) : b(x) {}
};
A a;
B b(a);
C c(b);

如果我需要一些需要能够访问其他类的所有实例的类 D,那么 D 的哪个定义更适合运行时和内存使用?这里有

权衡吗?

可能性1:

class D
{
public:
    C& c;
    D(C& x) : c(x) {}
};
D d(c);

访问类 A 对象的数据,如下所示: int x = d.c.b.a.data;

可能性2:

class D
{
public:
    A& a;
    B& b;
    C& c;
    D(A& x, B& y, C& z) : a(x), b(y), c(z) {}
};
D d(a,b,c);

访问类 A 对象的数据,如下所示: int x = d.a.data;

出于我的目的,D2 永远不会使用 C 也无权访问的引用进行初始化。

这些选项之一总是比另一个更好吗?这是时间与空间的问题吗?

就空间而言,它将相当接近(除非您分配大量对象(。引用实际上只是一个指针,因此这些类一开始就不太大。使用 D 的第二个实现,您将获得一些重复(您将有两个对A的引用(,但这似乎总体上可以忽略不计。

时间可能会成为一个问题。使用D的第 1 版需要读取 5 个内存位置以到达 adata成员。这可能会导致缓存未命中,最坏的情况还会导致页面错误。情况似乎不太可能如此。这实际上取决于对象的分配位置。不仅如此,它还涉及更多执行d.c.b.a.data指令。这并不是说版本 2 不受缓存/分页问题的影响,只是当您引用较少的变量时,它们的可能性会降低一些。很难就您提供的信息需要多少时间做出任何具体陈述。这些只是一些潜在的问题。

除非您在高性能设置中处理大型程序和大型数据,否则这些注意事项可能没有实际意义。更好的软件设计可能是选择设计的首要因素。

最后,D的第 1 版似乎比第 2 版更好的 OO 设计。