ylww

随笔仅作学习记录,请辩证参考!!!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  166 随笔 :: 0 文章 :: 0 评论 :: 11701 阅读

首先,毫无疑问,即使是常量(字符串常量)也是要占据空间的。

 

一般来说,基本类型(整型、字符型等)常量会在编译阶段被编译成立即数,占的是代码段的内存。(代码段是只读的,而且不允程序员获取代码段的地址,所以在c++中,尽量不为const分配数据段的内存,但是一旦取cosnt的地址,就不得不分配了,但是读const的时候,依然是从代码段读取那个立即数)。当然,占代码段的内存一般不在我们常说的“占内存”范围中。代码段不是寄存器。

 

而字符串常量或基本类型的常量数组占用的是数据段内存。

程序中但凡出现“XXX”形式,这都是代表字符串常量,是要事先存储在程序的只读数据区的。

void  test(){

  char name[32] = "hello,world";  // "hello,workd" 存储在程序的只读数据区, name 存储在test函数的栈区。

}

其实是有两份存在的。

string name = "hello,world";同样是存在两份的,与char name[32]的区别在于: string的变量即对象,本身是在栈区,此栈区中有个指针变量,指向堆区(动态内存分配),此堆区正是用来复制接收存储在只读数据区的字符串常量的。

 

char name[] = {'r', 'd', 'n',‘\0’};这种写法则只存一份。

posted on   理想主义者光芒万丈  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
点击右上角即可分享
微信分享提示