c++ - 引用是如何在内部实现的?

标签 c++ pointers reference

我只是想知道如何在不同的编译器和调试/发布配置中实际实现引用。该标准是否就其实现提供了建议?实现有什么不同吗?

我尝试运行一个简单的程序,在该程序中我从函数返回非常量引用和指向局部变量的指针,但它们的工作方式相同。这是否意味着引用在内部只是一个指针?

最佳答案

只是重复一些大家一直在说的东西,让我们看看一些编译器输出:

#include <stdio.h>
#include <stdlib.h>

int byref(int & foo)
{
  printf("%d\n", foo);
}
int byptr(int * foo)
{
  printf("%d\n", *foo);
}

int main(int argc, char **argv) {
  int aFoo = 5; 
  byref(aFoo);
  byptr(&aFoo);
}

我们可以用 LLVM 编译它(关闭优化),我们得到以下结果:

define i32 @_Z5byrefRi(i32* %foo) {
entry:
  %foo_addr = alloca i32*                         ; <i32**> [#uses=2]
  %retval = alloca i32                            ; <i32*> [#uses=1]
  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
  store i32* %foo, i32** %foo_addr
  %0 = load i32** %foo_addr, align 8              ; <i32*> [#uses=1]
  %1 = load i32* %0, align 4                      ; <i32> [#uses=1]
  %2 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %1) ; <i32> [#uses=0]
  br label %return

return:                                           ; preds = %entry
  %retval1 = load i32* %retval                    ; <i32> [#uses=1]
  ret i32 %retval1
}

define i32 @_Z5byptrPi(i32* %foo) {
entry:
  %foo_addr = alloca i32*                         ; <i32**> [#uses=2]
  %retval = alloca i32                            ; <i32*> [#uses=1]
  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
  store i32* %foo, i32** %foo_addr
  %0 = load i32** %foo_addr, align 8              ; <i32*> [#uses=1]
  %1 = load i32* %0, align 4                      ; <i32> [#uses=1]
  %2 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %1) ; <i32> [#uses=0]
  br label %return

return:                                           ; preds = %entry
  %retval1 = load i32* %retval                    ; <i32> [#uses=1]
  ret i32 %retval1
}

两个函数的主体是相同的

关于c++ - 引用是如何在内部实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954764/

相关文章:

c - 段错误 : 11, C 绝对初学者指南,第 3 版 Chapter6ex1.c

sql - 你使用了哪些编码技巧来避免编写更多的 sql?

.net - 引用的 DLL 未复制到引用项目

c++ - 是否有 C++ 跨平台键/值 API 或 C++ 库?

c# - 在来自 c#(回调)的非托管 c++ dll 中使用循环操作

c - 链表和内存地址

c# - Microsoft.SqlServer.Types.dll——为什么/如何在我的解决方案中引用它?

c++ - 尝试学习 BOOST::ANY Q1

c++ - SEC_WINNT_AUTH_IDENTITY 创建 (SSPI)

c++ - 对指针及其地址感到困惑