函数存储在C ++程序中的哪个位置?
例如
int abc()
{
//where am I stored?
}
我知道我们可以获取函数的地址,这意味着函数存储在内存中的某个位置。但我已经在许多地方读过没有功能的内存分配。
我很困惑。我的问题对你们许多人来说似乎含糊不清,但我无能为力。
答案 0 :(得分:9)
在运行之前,程序被加载到内存中,包括加载实现函数的代码。
一旦程序开始运行,就不会对功能进行内存分配;它是在程序启动之前由系统的程序加载器完成的。
这假设一个“正常”的桌面操作系统,对于运行ROM代码的嵌入式系统,情况往往不同。
答案 1 :(得分:2)
内存中函数的位置和顺序由链接器控制,可以通过编辑链接器命令文件进行调整。
这在嵌入式系统中尤为重要。例如,您可能希望指定哪些函数存储在快速内部存储器中以及哪些函数存储在较慢的外部存储器中。函数的顺序对于优化缓存等很重要。
要找出每个函数和(全局)变量的存储位置,请查找链接器创建的* .map文件。
答案 2 :(得分:0)
扩展其他两个答案:
在大多数(非嵌入式)平台上,编译单元时,代码和数据存储在目标文件的部分中。链接器在组装最终程序时将这些部分组合在一起。例如,在COFF,PE和ELF对象格式中,所有代码都放在 .text
部分中。所有预先初始化的数据都存储在.data
或.bss
部分。
这些 加载程序时,运行时链接程序(在Linux上称为ld-linux.so
)将整个程序加载到一个或多个内存区域,操作系统会将每个部分映射到它们的自己的记忆段。这假设平台同时具有MMU和内存分段,就像在x86上一样。为了安全起见,许多现代操作系统还随机化了加载这些部分的位置。因此,对于程序的每次运行,给定的函数可能没有相同的地址。
答案 3 :(得分:0)
在某些操作系统中,可以将功能存储在磁盘上,直到访问它们为止。操作系统可以预留一个区域来按需加载这些功能。有关更多信息,请搜索“操作系统分页”。
一些编译器和链接器允许程序员指定功能位置。为方便起见,他们定义段并允许将段放置在不同的位置。在嵌入式系统中,这允许一些功能驻留在ROM中,一些驻留在Flash中,另一些驻留在RAM中。
在大多数情况下,程序并不关心函数在内存中的位置。编译器生成“位置无关代码”,操作系统在加载程序时分配物理地址。