当课程成员成员时,为什么参考会占据内存
Why do references occupy memory when member of a class?
我被告知,当参考文献是类的数据成员时,它们会占据内存,因为它们会被编译器转换为恒定的指针。这是为什么?就像为什么编译器(我知道它是特定于实现的(当时是指指针,而不是临时变量时的指针?因此,在此代码中:
class A{
public:
A(int &refval):m_ref(refval){};
private:
int &m_ref;
}
m_ref将被视为恒定指针(即它们确实占据内存(。
但是,在此代码中:
void func(int &a){
int &a_ref = a;
}
编译器仅用实际变量替换参考(即它们不占据内存(。
因此,要简化一点,我的问题基本上是:在数据成员中,将引用变成恒定指示比临时变量时更有意义?
C 标准仅定义参考的语义,而不是实际实现的方式。因此,这个问题的所有答案都是针对编译器的。一个(愚蠢但兼容的(编译器可能会选择将所有参考存储在硬盘上。只是事实证明,将参考作为恒定的指针作为班级成员的恒定指针,并在可能的情况下替换参考的出现是最方便/有效的。
作为一种情况,如果编译器不可能在编译时间确定对象绑定哪个对象的情况,请考虑以下方式:
考虑:#include <iostream>
bool func() {
int i;
std::cin >> i;
return i > 5;
}
int main() {
int a = 3, b = 4;
int& r = func() ? a : b;
std::cout << r;
}
so 一般一个程序必须在运行时存储一些有关参考的信息,有时,对于特殊情况,它可以在编译时证明参考到。
参考(或指针(必须存储在内存中,那么为什么不将其与其他类一起存储呢?
即使在您的示例中,参数A(int &a
(也存储在内存中(可能在堆栈上(,那么a_ref
不再使用任何内存,只是一个别名,但是那里 is a
使用的内存。
想象类只是用户定义的数据类型。您需要拥有一些可以使您进入所引用的实际内容。在第二种情况下,使用实际值更多是关于编译器及其工作来优化您的代码。引用应该是对某些变量的别名,为什么当可以优化的记忆直接从堆栈中获取时,为什么要使用该别名。
相关文章:
- C++错误消息*成员参考.**初学者*
- 当课程成员成员时,为什么参考会占据内存
- 参考数据成员到模板的实例化
- 如何调用成员初始化器列表中参考成员的构造函数
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除
- 为什么要为具有参考成员变量的类生成默认的复印件
- 参考的复制构造可以使用私有成员变量
- 通过名称或索引参考成员变量
- 不确定如何修复;非静态成员参考必须相对于特定对象
- 通过参考const成员通过参考时,尝试引用已删除的函数
- 成员函数返回成员变量的RVALUE参考
- 我如何在参考上使用数据成员而不使用新关键字创建对象
- 常量正确性和成员参考
- 参考成员函数调用
- sizeof参考对于类型和数据成员的不同
- 声明模板会员参考另一个类的模板成员数组
- 通过参考存储的C 变体类成员
- 参考类型静态数据成员的问题可能是编译器错误