【发布时间】:2020-12-22 15:51:43
【问题描述】:
看起来,引用只是一个别名,但是,例如,将引用字段添加到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。我理解的前两个数字,第三个 - 不。为什么添加此类引用很重要——存储在该内存中的内容在编译时时无法解析?与指针不同,一旦声明,引用无论如何都不能通过设计更改,可以吗?那么为什么要存储它们呢?
【问题讨论】:
-
虽然它可能可以在编译时解决,但看起来编译器还没有使用这种优化进行编程。通常,引用数据成员将像
T * const成员一样实现。 -
请考虑引用数据成员并不总是那么容易弄清楚。考虑一下如果添加一个将其他对象分配给这些引用的构造函数会发生什么。编译器需要能够在消除这些成员之前确定这是否可能发生。
-
我预计这要么是一个硬优化,要么是在实际代码中不会经常发生的情况,因此值得。但是,clang 和 gcc 都是开源的,并且都乐于接受一个补丁来优化这个用例场景。
-
@MikhailT。我以为你的问题很笼统。无论如何,如果您手动初始化成员引用怎么办?简化演示:godbolt.org/z/3MxjKe。我不认为同一类型的对象的字节大小可以取决于它们的初始化形式。
-
@MikhailT。在我的示例中,
x.r不指向x.a,它指向a局部变量main。因此,x内部的a和r不是一回事。我可能应该为该局部变量使用不同的名称:godbolt.org/z/1n3jaE。