为什么引用会占用内存?
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
可以强制它们不被优化,因为删除它们将是结构大小的“可观察”变化:
即使 first
和 second
结构按照您的方式定义,我认为,这些引用成员也无法优化掉(如果我们谈论的不是您编写的特定程序,但在使用这些结构的一般情况下)。例如,假设在代码中的某个点,您将决定创建 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 尝试)。
看起来,引用只是一个 别名 ,但是,例如,向 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
可以强制它们不被优化,因为删除它们将是结构大小的“可观察”变化:
即使 first
和 second
结构按照您的方式定义,我认为,这些引用成员也无法优化掉(如果我们谈论的不是您编写的特定程序,但在使用这些结构的一般情况下)。例如,假设在代码中的某个点,您将决定创建 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 尝试)。