常量取地址
题目:
下面代码有什么问题?
1 |
|
答案解析:
在 Go 语言中,常量在编译时被解析和计算,并直接嵌入到生成的可执行文件中。这意味着在程序运行时,常量的值已经被硬编码到了指令中,而不需要为其分配内存空间。
常量的值在编译阶段就已经确定,并且是不可变的。由于常量的值是固定的,编译器可以直接将其替换为字面值。因此,在运行时并不需要为常量分配内存空间,也不需要为其保存内存地址。
与常量不同,变量的值是在运行时动态确定的,因此需要为变量分配内存空间,并且变量在内存中有对应的地址。
总结起来,常量在编译时被解析和计算,并且其值直接嵌入到生成的可执行文件中,因此不占用内存地址。而变量的值在运行时确定,需要为其分配内存空间,并且具有对应的内存地址。
以下解析来自 Go语言中文网
考点:常量
常量不同于变量的在运行期分配内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用,
1 |
|
内存四区概念:
A.数据类型本质:
固定内存大小的别名
B. 数据类型的作用:
编译器预算对象(变量)分配的内存空间大小。
C. 内存四区
流程说明
1、操作系统把物理硬盘代码load到内存
2、操作系统把c代码分成四个区
3、操作系统找到main函数入口执行
栈区(Stack):
空间较小,要求数据读写性能高,数据存放时间较短暂。由编译器自动分配和释放,存放函数的参数值、函数的调用流程方法地址、局部变量等(局部变量如果产生逃逸现象,可能会挂在在堆区)
堆区(heap):
空间充裕,数据存放时间较久。一般由开发者分配及释放(但是Golang中会根据变量的逃逸现象来选择是否分配到栈上或堆上),启动Golang的GC由GC清除机制自动回收。
全局区-静态全局变量区:
全局变量的开辟是在程序在main
之前就已经放在内存中。而且对外完全可见。即作用域在全部代码中,任何同包代码均可随时使用,在变量会搞混淆,而且在局部函数中如果同名称变量使用:=
赋值会出现编译错误。
全局变量最终在进程退出时,由操作系统回收。
我么在开发的时候,尽量减少使用全局变量的设计
全局区-常量区:
常量区也归属于全局区,常量为存放数值字面值单位,即不可修改。或者说的有的常量是直接挂钩字面值的。
比如:
1 |
|
cl是字面量10的对等符号。
所以在golang中,常量是无法取出地址的,因为字面量符号并没有地址而言。