首页 > 后端开发 > C++ > 正文

C 中的引用实际上是如何实现的?

Susan Sarandon
发布: 2024-11-26 09:02:14
原创
173 人浏览过

How Are References Actually Implemented in C  ?

跨编译器和配置的引用实现

C 中的引用是一个强大的功能,可以高效地访问超出变量范围的内存。但它们实际上是如何实现的呢?

标准建议和实现差异

C 标准没有强制要求特定的实现以供参考。但是,编译器通常遵循某些准则:

  • 引用通常实现为指向所引用对象的指针。
  • 引用可以引用局部变量和全局变量。
  • 指针和引用通常可以互换。

示例程序和编译器输出

为了演示引用的内部实现,请考虑以下程序:

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

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

int main() {
  int aFoo = 5;
  byref(aFoo);
  byptr(&amp;aFoo);
}
登录后复制

在禁用 LLVM 和优化的情况下编译此程序会生成相同的汇编代码byref 和 byptr 函数:

define i32 @_Z5byrefRi(i32* %foo) {
  %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) {
  %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 中密切相关的概念。虽然标准没有规定具体的实现,但编译器通常将引用实现为指针。这允许高效且可互换地使用引用和指针来访问变量范围之外的内存。

以上是C 中的引用实际上是如何实现的?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板