引用到底占不占内存空间?

“声明”和“定义”的区别

首先理解:“声明”和“定义”的区别

在我以往的课本中,没有明确说明声明和定义的作用。

在《C++Primer》中

声明:向编译器“介绍”变量(标识符),告诉编译器该变量的类型与名字。

定义:向变量分配存储空间,也可进行初始化。在程序中,变量有且只有一个定义

声明包括:

  • 定义(因在定义时就已经声明了变量的类型与名字)
  • extern关键字,以标示变量或者函数的定义在别的文件中
  • 函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。

对引用是否占用内存的探讨

引用在C++里的作用是:变量的别名(对引用只有声明没有定义)

有些人认为:引用不占据内存空间,或者说和原始变量共享同一内存

也有一些人认为:引用占用内存空间,因为编译器会将其解析为一个* const p,在内存中为引用开辟了一个指针型的内存单元(我比较赞同这一点)。

不过,我觉得这位CSDN大佬说的也有一定道理。

image-20210430120807694

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream> 
using namespace std;
struct Test
{
int a[5];
int &b;
//double &b;
//char &b;
};

int main()
{

//24 无论int\double\char & 同指针一样,占用一个4字节的内存空间(32位机)
cout << "结构体占用的内存空间字节大小为:" << sizeof(Test);
//Test test;
//创建结构体对象。(报错 error C2512:“Test”: 没有合适的默认构造函数可用。原因:引用未初始化)
//cout << "结构体对象占用的内存空间字节大小为:" << sizeof(test);

return 0;
}
//代码中只是对结构体进行声明,系统并没有对其分配实际的内存单元。如果此时在main函数中创建一个结构体对象,编译器就会报错。
// 注意点:引用在定义时,必须初始化。

PS: sizeof在编译期得到对象的大小。

string类关于sizeof(string)在VS2017上是28,并不是字符串的长度。

参考文章

https://blog.csdn.net/sjxbf/article/details/6310150

http://www.karottc.com/blog/2015/07/29/cpp-reference/

https://blog.csdn.net/wanttifa/article/details/100904422

https://blog.csdn.net/weixin_42709632/article/details/104814514?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

---------------- 本文结束 ----------------

本文标题:引用到底占不占内存空间?

文章作者:Pabebe

发布时间:2021年04月30日 - 09:37:48

最后更新:2021年04月30日 - 14:00:02

原始链接:https://pabebezz.github.io/article/6d801e4/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%