而不是写:
string name = first->next->next->next->name;
int age = first->next->next->next->age;
将其写为:
node* billy_block = first->next->next->next;
string name = billy_block->name;
int age = billy_block->age;
更有效率吗?变量有可能吗billy_block
会被编译器“优化掉”吗?
我不懂编译器,所以请使用简单的术语。
任何有自尊心的现代编译器都会优化原始代码,以在安全的情况下消除对同一指针链的重复取消引用。
但是,首先,代码的原始版本的可读性比使用中间变量的版本低得多。当指针解引用链很长时,人眼并不能立即明显看出这些链是相同的。带有中间变量的变体明确表明我们想要读取name
and age
来自同一个对象。在第一个变体中,它甚至远没有那么清楚。
其次,在别名图片对编译器来说不像您的情况那么明显的情况下,编译器可能不得不放弃优化。例如。一般情况下,当你做类似的事情时
some_ptr->next = first->next->next->next->next;
some_ptr->prev = first->next->next->next->prev;
编译器无法确定第一个赋值不会影响first->next->next->next
。 (考虑如果some_ptr
等于first
.) 这迫使编译器谨慎行事并重新评估first->next->next->next
每次从一开始。在这种情况下引入中间变量确实会优化代码。当然,为此,您自己必须确保这是正确的做法,即使用您自己对程序中可能出现的别名的了解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)