gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:49:20 25 4
gpt4 key购买 nike

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

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

最佳答案

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

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com