参考 - sizeof是否返回实际内存大小?

Al2*_*227 2 c++ reference sizeof

我知道这个问题可能已经以多种不同的方式提出,但我加入了自己的问题,因为这对我来说仍然不清楚.

考虑以下代码:

long double q = 1.2;
long double &p = q;
cout << sizeof(p) << endl;`
Run Code Online (Sandbox Code Playgroud)

long double 在我的机器上是12个字节,代码的输出是预期的12,因为标准说:

应用于引用或引用类型时,结果是引用类型的大小.(ISO C++ $ 5.3.3/2)

但是你们很可能都知道,参考实现是免费的,因此,正如标准所说:

未指定参考是否需要存储(3.7).

所以看来明天我可以提出我自己的引用实现,它需要200个字节,并确保sizeof运算符返回正确的对象大小(而不是返回我的引用的真实实现大小)

所以我的问题实际上非常简单:

我们可以依赖sizeof运算符来返回包含类的实际内存占用,特别是引用成员吗?

ric*_*ici 6

比较和对比:

struct container {
  long double& dbl;
};

std::cout << sizeof(container::dbl) << '\n';
std::cout << sizeof(container)      << '\n';
Run Code Online (Sandbox Code Playgroud)

(活在ideone上)

一行告诉您引用对象的大小.另一个告诉你包含引用的结构的大小.

这种行为不是偶然的.它是由标准定义的,是的,你可以依赖它.

在这个问题背后似乎有一个假设,即sizeof具有引用或引用类型的运算符的行为在某种程度上是任意的和常规的.事实并非如此; 它不符合通常适用于引用的相同逻辑.

如果我有

long double dbl;
Run Code Online (Sandbox Code Playgroud)

那么dbl在其范围内的任何使用都是左值,也就是说参考.这是必要的,以便可以为其赋值dbl.因此,dbl(例如透露decltype(dbl))的类型long double&不是long double.

sizeof(dbl)返回引用本身的大小而不是引用对象的大小是荒谬的.

一旦你将引用放入一个结构中,你就会有一个完全不同的野兽.作为对象的一部分,引用占用空间,除非可以优化掉包含它的整个对象,否则无法对其进行优化.