作用域解析和this运算符

4

我最近参加的一门(C++)课程中,老师提到使用->运算符比使用点标记和手动解引用指针(例如(*ptr))稍微慢了一点。

  1. 这是真的吗?如果是,为什么?
  2. 是否也适用于C语言?

5
既然 a->b 只是 (*a).b 的语法糖,我非常怀疑这种说法。 - unwind
1
@unwind 既然你可以重载 ->*,原则上你可以调皮地在 -> 实现中插入一个 sleep(n)。但是,是的... - Konrad Rudolph
3
@unwind 嗯,这也是我想的。 @KonradRudolph "有些人只是想看着世界燃烧" :) - Marcus Hansson
1个回答

6
-> 运算符和 . 运算符既不比另一个更慢也不更快。事实上,解引用 操作比仅仅访问内存位置慢,因为多了一次间接寻址动作。这是生活中的一个事实,在 C 和 C++ 以及其他任何语言中都是如此。
在 C++ 中,你还可以使用 引用 来解引用某个东西,因此你也可以使用 . 来解引用!所以问题并不在于 箭头 vs 点,而在于编译器是否可以直接访问值,还是必须先搜索其地址。

你也有引用。是的,但他肯定是指取消引用一个指针,而不是“取消引用引用”(或者叫什么)。 - Marcus Hansson
根据我的理解,OP并不是在谈论指针与直接对象访问的区别,而是关于通过指针访问对象的不同符号表示法,即p->member(*p).member,它们在默认实现中是完全相同和彻底相同的。对于Marcus:拿回你的钱。 - Peter - Reinstate Monica
1
拿回你的钱。我是瑞典人。大学是免费的。但如果我付了钱,我肯定会要求退款。 - Marcus Hansson
@PeterSchneider 哦... 我想你是对的!那么,答案将变成“” :) - Paolo M
将某物解除引用会变慢,这是生活的事实,无论是在C、C++还是其他任何语言中都是如此。虽然如此,优化编译器——尤其是具有更多信息的JIT编译器——如果能够证明引用始终指向同一对象(例如在C++中对于“引用”始终为真),则可能可以优化掉解除引用操作。 - Peter - Reinstate Monica
例如,使用变量而不是文字也涉及间接性,正如我在其他地方所述(参见http://stackoverflow.com/a/32736116/3150802)。当我玩弄代码时,我发现编译器会将“int i = 11; int f(){return i * i;}”转换为简单的“return 121”,除非我明确关闭了优化。指针应该进行类似的优化。 - Peter - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接