使用指针会导致内存堵塞吗?

Yot*_*tam 3 c++ optimization performance memory-bandwidth

假设我有这样的结构c++:

class A{
  public:
    B b;
}

class B{
  public:
    C c;
}

class C{
  public:
    double x;
    double y;
    double z;
    double s;
    function Usize(){
      s  = sqrt(pow(x,2) + pow(y,2) + pow(z,2));
    }
}
Run Code Online (Sandbox Code Playgroud)

c十次访问值需要比创建直接指向c并使用它的内存流量更多吗?在代码术语中(假设合法值):

double dx = 2*rand()-1;
double dy = 2*rand()-1;
double dz = 2*rand()-1;

a->b->c.x *= dx;
a->b->c.y *= dy;
a->b->c.z *= dz;

if (a->b->c.x > 10) a->b->c.x -= 10;
else if (a->b->c.x <0) a->b->c.x += 10;
if (a->b->c.y > 10) a->b->c.y -= 10;
else if (a->b->c.y < 0) a->b->c.y += 10;
if (a->b->c.z > 10) a->b->c.z -= 10;
else if (a->b->c.z < 0) a->b->c.z += 10;

a->b->c->Usize();
Run Code Online (Sandbox Code Playgroud)

double dx = 2*rand()-1;
double dy = 2*rand()-1;
double dz = 2*rand()-1;


C* ac = a->b->c
ac.x *= dx;
ac.y *= dy;
ac.z *= dz;

if (ac.x > 10) ac.x -= 10;
else if (ac.x < 0)  ac.x += 10;
if (ac.y > 10) ac.y -= 10;
else if (Ac.y < 0) ac.y += 10;
if (ac.z > 10) ac.z -= 10;
else if (ac.z < 0) ac.z += 10;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mys*_*ial 11

机会不是.没有区别.

虽然取消引用链接确实会导致更多的内存访问,但现代编译器能够完全按照您的方式执行操作.(也就是说,将您的第一个示例转换为您的第二个示例.)

这是由于称为Common Subexpression Elimination(CSE)的标准编译器优化.

这个名字几乎说明了一切.在您的第一个示例中,a->b->c将由编译器优化的公共子表达式.它只会被评估一次,保存结果,并重用于所需的所有实例.


有许多情况可能会阻止编译器进行此类优化.

  1. 如果声明了任何相关变量volatile,则不允许进行此优化,因为volatile变量要求每次使用它时都要重新加载.
  2. 如果(或可能)修改了任何相关变量,则不允许进行此优化,因为它可能产生不同的结果.

不过,作为旁注,你的第二个例子也更具可读性,因为它有取消引用链接.
因此,如果我必须选择使用哪个,我还是会选择第二个例子.