为什么引用会占用内存?

Why do references take up memory?

看起来,引用只是一个 别名 ,但是,例如,向 struct 添加引用字段会增加结构的大小,即使引用在声明时被初始化为相同结构的另一个字段的别名。

例如:


#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;
};

上面的程序在此处打印:8 8 24。前两个数字我理解,第三个——不。为什么添加此类引用很重要——存储在内存中的内容无法在 编译时 解析?与指针不同,一旦声明,引用无论如何都不能通过设计改变,不是吗?那么为什么要存储它们?

这个答案提到对象很可能会被优化掉,但是调用 sizeof 可以强制它们不被优化,因为删除它们将是结构大小的“可观察”变化:

即使 firstsecond 结构按照您的方式定义,我认为,这些引用成员也无法优化掉(如果我们谈论的不是您编写的特定程序,但在使用这些结构的一般情况下)。例如,假设在代码中的某个点,您将决定创建 second 结构的实例,但以不同方式初始化引用成员,甚至可能以编译时未知的动态方式初始化。考虑以下用法:

#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';
}

在上面的程序中,编译器根本无法事先知道 third.two 是指 i 还是 j:这取决于用户在 [= 处输入的数字24=]-时间(例如,通过输入 7 而不是 100,在 https://godbolt.org/z/43bM1o 尝试)。