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有什么不对吗?艺术是可观察的吗?参考文献无论如何都不应该有自己的大小(或地址)。。。