如果我们有这个代码:
int foo=100;
int& reference = foo;
int* pointer = &reference;
参考数据和指针数据之间没有实际的二进制差异。 (它们都包含foo
)内存中的位置
第2部分
那么指针和引用(discussed here)之间的所有其他差异在哪里出现?编译器是否强制执行它们,或者它们是否在可组合级别上实际上是不同类型的变量?换句话说,请执行以下操作相同的汇编语言?
foo=100;
int& reference=foo;
reference=5;
foo=100;
int* pointer=&foo;
*pointer=5;
答案 0 :(得分:18)
理论上,它们可以以不同的方式实施。
实际上,我见过的每个编译器都编译指针和对同一机器代码的引用。区别完全在语言层面。
但是,就像cdiggins所说,在你验证它对你的编译器和平台是正确的之前,你不应该依赖这个概括。
答案 1 :(得分:10)
C ++代码与编译器生成的机器代码之间的关系绝对没有可靠性。
有人说“根据我的经验......等等”但这比你意识到的更不可靠。在所有可能的编译器/体系结构组合的任何实质性横截面中,没有多少人具有实际经验。 [编辑:我认为Crashworks证明我错了。 : - )]
现在将此列表乘以以下short list of machine architectures:
现在乘以操作系统和优化标志,您可能会发现每个人的体验都非常缺乏。
答案 2 :(得分:1)
指针和引用在C ++中有不同的语义,但生成的代码是相同的。
答案 3 :(得分:0)
只是为了放大,虽然引用可能与几乎所有编译器下的引擎相同,但依赖于这种行为是一个严重的错误。当你最不期望它时,它不仅可能会咬你的屁股,而且也错误地使用引用。如果它是你需要的指针,请使用指针。