引用占用字节和指针一样,但是引用变量本身占用内存却和类型相关,为什么?

jbz001 2018-06-06 06:03:47
先看代码:

char g_cChr = '1';

class CValue
{
public:
CValue() :m_cChr(g_cChr) {}
~CValue() {}
int GetSize()
{
return sizeof(m_cChr);
}

private:
char &m_cChr;
};

int main()
{
char cChr = '1';
char &cTemp = cChr;
CValue oValue;
cout << sizeof(oValue) << " " << oValue.GetSize() << " " << sizeof(cTemp) << endl;

return 0;
}


在64位计算机执行,结果是:8 1 1
查过资料,引用的内部实现其实是指针,所以引用占用的空间和指针是一样的。
类 CValue 只有一个成员变量,引用的是字符型的变量。 CValue 类占用8字节,而 m_cChr 却只有1字节, cTemp 也只有1字节。
为什么?
...全文
1163 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2018-08-14
  • 打赏
  • 举报
回复
引用 10 楼 lizhentao0707 的回复:
为什么sizeof(类内部的引用型数据成员),不是其绑定对象类型的大小,sizeof(oValue)为什么等于8啊?


因为你的CValue 等价于
class CValue
{
public:
CValue() :m_cChr(&g_cChr) {}
~CValue() {}
int GetSize()
{
return sizeof(*m_cChr);
}

private:
char *m_cChr;
};

所以sizeof(CValue)是8
sizeof(m_cChr)是8
sizeof(*m_cChr) 是1
赵4老师 2018-08-12
  • 打赏
  • 举报
回复
为什么不参考g++源代码中sizeof实现相关源代码片段呢?
lizhentao0707 2018-08-11
  • 打赏
  • 举报
回复
为什么sizeof(类内部的引用型数据成员),不是其绑定对象类型的大小,sizeof(oValue)为什么等于8啊?
lizhentao0707 2018-08-11
  • 打赏
  • 举报
回复
为什么sizeof类内部的引用型数据成员,不是其绑定对象类型的大小,sizeof(oValue)为什么等于8啊?
zhouqunhai 2018-06-07
  • 打赏
  • 举报
回复
引用不是指针就是变量的别名而已,当然它的大小和实际类型有关
CyberLogix 2018-06-07
  • 打赏
  • 举报
回复
因为引用就是个别名而已,他的大小就是实际类型的大小,而指针其实是个表示地址的类型,一般就是4个字节
AlbertS 2018-06-07
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
sizeof 后如果是引用类型,得到的大小是被引用的类型大小,而不是实现引用的指针大小 When applied to a reference type, the result is the size of the referenced type. http://en.cppreference.com/w/cpp/language/sizeof
sizeof 后如果是引用类型,得到的大小是被引用的类型大小,就是这个理
赵4老师 2018-06-07
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
displayMessage 2018-06-07
  • 打赏
  • 举报
回复
因为指针是一种类型,而引用不是一种类型,它仅仅是一个变量的别名。 在思考这个问题的时候,不妨先想一下,变量名是什么。变量名是对一块内存的别名,那么这块内存有一个别名和有两个别名是不是就不奇怪了。 而指针不同,指针是一种基本类型,在32位机上,它占据4个字节,记录着一个地址。
liulilittle 2018-06-07
  • 打赏
  • 举报
回复
char a1 = 0; char& a2 = a1; char* a3 = a2; sizeof(a1) (展开->sizeof(char)) sizeof(a2) (展开->sizeof(char)) sizeof(a3) (展开->sizeof(char*)->sizeof(void*)) sizeof(char&) 类型的变量时 C/C++并不认为开发人员是在测量char&类型大小 而是测量类型char的大小,还有一点在C/C++中“Type&”的变量它并不是“引用类型”而是“传址类型”,而且“传址类型”与“引用类型”之间是存在很多不同的区别的。 sizeof(char*) 类型的变量时,它被认定为引用类型大小等于“void*”在当前的编译平台地址表示所需要的大小,例IA32为32bit,x64为64bit位二进制的长度。 sizeof(char) 类型的变量时,它仅仅是获取当前的类型大小。
paschen 版主 2018-06-06
  • 打赏
  • 举报
回复
sizeof 后如果是引用类型,得到的大小是被引用的类型大小,而不是实现引用的指针大小 When applied to a reference type, the result is the size of the referenced type. http://en.cppreference.com/w/cpp/language/sizeof

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧