C++ 为什么引用会占用内存?
看起来,引用只是一个别名,但是,例如,将引用字段添加到C++ 为什么引用会占用内存?,c++,reference,sizeof,C++,Reference,Sizeof,看起来,引用只是一个别名,但是,例如,将引用字段添加到结构,即使引用在声明时被初始化为同一结构的另一个字段的别名,也会增加结构的大小 例如: #include <iostream> using namespace std; int main(int, char **) { struct { int integers[2]; } first; struct { int integers[2]; int &am
结构
,即使引用在声明时被初始化为同一结构的另一个字段的别名,也会增加结构的大小
例如:
#include <iostream>
using namespace std;
int
main(int, char **)
{
struct {
int integers[2];
} first;
struct {
int integers[2];
int &one = integers[0];
int &two = integers[1];
} second;
cout << sizeof first << " " << sizeof first.integers << " " <<
sizeof second << " " << endl;
return 0;
};
#包括
使用名称空间std;
int
主(整型,字符**)
{
结构{
整数[2];
}第一,;
结构{
整数[2];
int&one=整数[0];
int&two=整数[1];
}第二;
cout这个答案提到对象很可能会被优化掉,但是调用sizeof
可以强制它们不被优化,因为删除它们将是结构大小的“可观察”变化:
即使以您的方式定义了第一个
和第二个
结构,我认为这些参考成员也无法优化掉(如果我们不是在讨论您编写的特定程序,而是在使用这些结构的一般情况下)例如,假设在代码中的某个点,您将决定创建<代码>第二版/代码>结构的实例,但以不同的方式初始化引用成员,甚至以动态方式初始化,在编译时不知道。请考虑以下用法:
#include <iostream>
int main()
{
struct
{
int integers[2];
} first;
struct
{
int integers[2];
int &one = integers[0];
int &two = integers[1];
} second;
int user_choice{ 0 };
std::cin >> user_choice;
int i{ 56 }, j{ 78 };
decltype(second) third{ {12, 34}, i, (user_choice < 42) ? i : j };
std::cout << third.integers[0] << ' ' << third.integers[1] << ' '
<< third.one << ' ' << third.two << '\n';
}
#包括
int main()
{
结构
{
整数[2];
}第一,;
结构
{
整数[2];
int&one=整数[0];
int&two=整数[1];
}第二;
int用户选择{0};
std::cin>>用户选择;
int i{56},j{78};
decltype(second)third{{12,34},i,(用户选择<42)?i:j};
Std::CUT虽然可能在编译时得到解决,但它看起来不像编译器那样用这种优化来编程。通常,引用数据成员将被实现为它是一个<代码> T*const 成员。考虑引用数据成员并不总是那么容易理解。d一个为这些引用分配其他对象的构造函数。编译器需要能够在消除这些成员之前确定是否会发生这种情况。我认为这要么是一个困难的优化,要么是一种在实际代码中不经常发生的情况,使其值得一试。但是,clang和gcc都是开放的source和任何一方都愿意接受一个补丁来优化这个用例场景。@MikhailT。我认为你的问题是一般性的。无论如何,如果你手动初始化成员引用会怎么样?简化的演示:。我认为相同类型的对象的字节大小不能依赖于它们的初始化形式。@MikhailT。在我的示例中,X.R.不指向<代码> x.a/c> >指向<<代码>变量> > >主< <代码> .<代码> a < /> >和<>代码> r>代码>内<代码> x>代码>因此不一样。我可能应该为该局部变量使用不同的名称:C++的量子力学……但是严重地,这个P有什么不对吗?艺术是可观察的吗?参考文献无论如何都不应该有自己的大小(或地址)。。。