gpt4 book ai didi

c++ - 引用 — sizeof 是否返回实际内存大小?

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:06 25 4
gpt4 key购买 nike

我知道这个问题可能已经以许多不同的方式被问到,但我添加了我自己的,因为这对我来说仍然不清楚。

考虑这段代码:

long double q = 1.2;
long double &p = q;
cout << sizeof(p) << endl;`

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

When applied to a reference or a reference type, the result is the size of the referenced type. (ISO C++ $5.3.3/2)

但是您很可能都知道,引用实现是免费的,因此,正如标准再次声明的那样:

It is unspecified whether or not a reference requires storage (3.7).

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

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

我们能否依靠 sizeof 运算符来返回包含引用成员的类的实际内存占用?

最佳答案

比较和对比:

struct container {
long double& dbl;
};

std::cout << sizeof(container::dbl) << '\n';
std::cout << sizeof(container) << '\n';

( Live on ideone )

一行告诉您所指对象的大小。另一个告诉您包含引用的结构的大小。

这种行为并非偶然。它由标准定义,是的,您可以信赖它。

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

如果我有

long double dbl;

那么在其作用域内对 dbl 的任何使用都是左值,也就是说 reference。这是必要的,以便可以为 dbl 赋值。所以 dbl 的类型(如 decltype(dbl) 所示)是 long double&,而不是 long double.

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

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

关于c++ - 引用 — sizeof 是否返回实际内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35087542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com