首先,毫无疑问,即使是常量(字符串常量)也是要占据空间的。
一般来说,基本类型(整型、字符型等)常量会在编译阶段被编译成立即数,占的是代码段的内存。(代码段是只读的,而且不允程序员获取代码段的地址,所以在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’};这种写法则只存一份。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)