我最近进入了一些集会,它很有趣,因为它挑战了我所学到的一切。我想知道我是否可以提出几个问题
运行可执行文件时,整个可执行文件是否会加载到内存中?
从一点点摆弄我发现常量不是真正的常量?它只是一个编译器吗?
const int i = 5;
_asm { mov i, 0 }
//我现在为0并且编译得很好
所有变量都分配了一个嵌入到文件中的常量值吗? 含义:
int a = 1;
const int b = 2;
void something()
{
const int c = 3;
int d = 4;
}
我是否会在文件中找到所有这些变量(在十六进制编辑器或其他内容中)?
答案 0 :(得分:2)
当可执行文件启动时,您的可执行文件(即代码)和数据段会映射到进程的虚拟地址空间,但在访问这些内存位置之前,实际上可能无法从磁盘复制这些字节。请参阅http://en.wikipedia.org/wiki/Demand_paging
C语言常量实际存在于内存中,因为您必须能够获取它们的地址。 (即&i
。)常量通常位于可执行映像的.rdata
段中。
一个常量会在某个地方占用内存 - 如果你的程序中有一个常数42,则必须在内存中存储42的地方,即使这意味着它存储为参数立即模式指令。
答案 1 :(得分:1)
操作系统加载代码和数据段,以便为执行做好准备 如果可执行文件具有资源段,则应用程序会根据需要加载部分资源段。
确实const
变量占用了内存空间但编译器 free 以优化
用于内存使用和代码大小,并将其值嵌入代码中
(如果他们没有检测到这些变量的任何地址引用)
const char *
又名C 字符串,通常由编译器interned来节省内存。