C++引用编译后会发生什么?
What happens after C++ references are compiled?
编译后引用变成什么,地址,还是常量指针?
我知道指针和引用的区别,但我想知道底层实现的区别
int main()
{
int a = 1;
int &b = a;
int *ptr = &a;
cout << b << " " << *ptr << endl; // 1 1
cout << "&b: " << &b << endl; // 0x61fe0c
cout << "ptr: " << ptr << endl; // 0x61fe0c
return 0;
}
迂腐的回答是:无论编译器感觉如何,重要的是它按照语言语义指定的方式工作。
要获得实际答案,您必须查看生成的程序集,或大量使用未定义行为。到那时,它就变成了一个特定于编译器的问题,而不是一个“一般的 C++”问题
实际上,需要存储的引用本质上变成了指针,而本地引用往往会被编译不存在。后者通常是这种情况,因为引用永远不会被重新分配的 gua运行tee 意味着如果你能看到它被分配,那么你就完全知道它指的是什么。但是,出于正确性目的,您不应该依赖它。
为了完整起见
通过将包含引用的结构内容 memcpy 到 char
缓冲区中,可以一些 深入了解编译器在有效代码中正在做什么:
#include <iostream>
#include <array>
#include <cstring>
struct X {
int& ref;
};
int main() {
constexpr std::size_t x_size = sizeof(X);
int val = 12;
X val_ref = {val};
std::array<unsigned char, x_size> raw ;
std::memcpy(&raw, &val_ref, x_size);
std::cout << &val << std::endl;
std::cout << "0x";
for(const unsigned char c : raw) {
std::cout << std::hex << (int)c;
}
std::cout << std::endl ;
}
当我在我的编译器上 运行 时,我得到了存储在结构中的 val
的(字节序翻转的)地址。
它在很大程度上取决于编译器,也许编译器决定优化代码,因此它会使它有价值或......,但据我所知,引用将像指针一样编译,我的意思是如果你看到它们的结果程序集,它们被编译成指针。
编译后引用变成什么,地址,还是常量指针?
我知道指针和引用的区别,但我想知道底层实现的区别
int main()
{
int a = 1;
int &b = a;
int *ptr = &a;
cout << b << " " << *ptr << endl; // 1 1
cout << "&b: " << &b << endl; // 0x61fe0c
cout << "ptr: " << ptr << endl; // 0x61fe0c
return 0;
}
迂腐的回答是:无论编译器感觉如何,重要的是它按照语言语义指定的方式工作。
要获得实际答案,您必须查看生成的程序集,或大量使用未定义行为。到那时,它就变成了一个特定于编译器的问题,而不是一个“一般的 C++”问题
实际上,需要存储的引用本质上变成了指针,而本地引用往往会被编译不存在。后者通常是这种情况,因为引用永远不会被重新分配的 gua运行tee 意味着如果你能看到它被分配,那么你就完全知道它指的是什么。但是,出于正确性目的,您不应该依赖它。
为了完整起见
通过将包含引用的结构内容 memcpy 到 char
缓冲区中,可以一些 深入了解编译器在有效代码中正在做什么:
#include <iostream>
#include <array>
#include <cstring>
struct X {
int& ref;
};
int main() {
constexpr std::size_t x_size = sizeof(X);
int val = 12;
X val_ref = {val};
std::array<unsigned char, x_size> raw ;
std::memcpy(&raw, &val_ref, x_size);
std::cout << &val << std::endl;
std::cout << "0x";
for(const unsigned char c : raw) {
std::cout << std::hex << (int)c;
}
std::cout << std::endl ;
}
当我在我的编译器上 运行 时,我得到了存储在结构中的 val
的(字节序翻转的)地址。
它在很大程度上取决于编译器,也许编译器决定优化代码,因此它会使它有价值或......,但据我所知,引用将像指针一样编译,我的意思是如果你看到它们的结果程序集,它们被编译成指针。