- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我在 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));
}
}
访问 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();
对比
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;
谢谢。
最佳答案
不可能。不会有什么区别。
虽然取消引用链接确实会导致更多的内存访问,但现代编译器能够完全按照您所做的去做。 (也就是说,将您的第一个示例转换为您的第二个示例。)
这是由于称为 Common Subexpression Elimination 的标准编译器优化所致。 (CSE)。
这个名字几乎说明了一切。在您的第一个示例中, a->b->c
是将由编译器优化的公共(public)子表达式。它只会被评估一次,结果会被保存,并在所有需要的实例中重复使用。
有许多情况可能会阻止编译器进行此类优化。
volatile
,则不允许进行此优化,因为 volatile
变量需要在每次使用时重新加载。不过,作为旁注,您的第二个示例也更具可读性,因为存在取消引用链接。
因此,如果我必须选择使用哪个,我还是会选择第二个示例。
关于c++ - 使用指针会导致内存堵塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8951675/
我是一个新的 java 用户。最近我了解到,在 Java 中,每个语句都以分号 (;) 结尾,并且每个 block 都由一对 ob 大括号分隔 - {}(如果我错了,请纠正我)。 但是在很多地方我发现
我是一个新的 java 用户。最近我了解到,在 Java 中,每个语句都以分号 (;) 结尾,并且每个 block 都由一对 ob 大括号分隔 - {}(如果我错了,请纠正我)。 但是在很多地方我发现
我正在尝试覆盖 Jade script. 标记,但我所做的一切都不起作用。 我有以下代码: 布局.jade block foot footer.container#footer
让我从这里开始。在 w3cshools.com - http://www.w3schools.com/jsref/met_win_setinterval.asp - 他们有一个片段演示如何使用 jav
我是一名优秀的程序员,十分优秀!