gpt4 book ai didi

c++ - 派生类比基类大,即使它由引用变量组成

转载 作者:太空狗 更新时间:2023-10-29 19:44:03 25 4
gpt4 key购买 nike

从我目前读到的内容来看,引用变量似乎根本不应该占用任何内存。相反,它们被视为它们所引用的完全相同的变量,但具有不同的名称。

但是,当我运行下面的代码时,似乎并不总是这样:

#include <cstdio>
struct A
{
int m[3];
};
struct B: A
{
B():x(m[0]), y(m[1]), z(m[2]){}
int& x;
int& y;
int& z;
};
int main(){
printf("%u, %u\n", sizeof(A), sizeof(B));
return 0;
}

输出:

12, 40

为什么 B 比 A 大这么多?

有没有其他方法可以访问 B.m[0] 和 B.x?

最佳答案

From what I've read so far, it seems that reference variables are not supposed to take any memory at all.

你应该进一步阅读 ;)说真的,引用不是魔法。所以在现实世界中,对象必须以某种方式存储有关引用绑定(bind)到哪个对象的信息。因此,虽然从概念上讲引用没有大小,但实际上它非常像指针,通常编译器只使用指针。编译器在编译时强制执行与指针不同的行为(非空、不可重新分配、无需取消引用)。

所以你看到的本质上就是A的大小加上padding加上三个指针的大小。我猜你使用的是 64 位系统,其中 sizeof(int) 是 4 而 sizeof(void*) 是 8:

 12 bytes for the A subobject (4 for each int)
+ 4 bytes padding (to get to a multiple of 8 bytes)
+24 bytes for the 3 references/pointers in B (8 for each one)
--------------
40 bytes total

对于你的另一个问题,给定一个 B 类型的对象 b,你可以直接访问 b.m[0],因为它在A 并公开继承。在没有您遇到的引用开销的情况下给它另一个名字是不可能的。

关于c++ - 派生类比基类大,即使它由引用变量组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061976/

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