来自Wikipedia:
此段的大小由程序员在编译或汇编程序之前放置的值确定,并且在运行时不会更改
那么谁真正确定了细分市场的规模?操作系统? 另外,什么时候计算? “在编译或汇编程序之前”是否意味着它是在预处理阶段完成的?
答案 0 :(得分:2)
对于传统编译语言,答案大致是链接器。
每个目标文件包含有关各个段的大小(和对齐等)的信息。当链接器将目标文件拼接在一起以形成可执行文件时,它将以尊重对齐的方式聚合匹配的段。因此,部件的顺序以及因此潜在的最终段的大小取决于链接器。
如果需要添加填充以保持对齐,则段的大小可能会更改。
请注意,解释或JIT编译的程序实际上没有段。
答案 1 :(得分:1)
“编译程序之前......”部分必须引用应存在的变量和/或常量。
数据部分/段的大小由链接器计算 - 链接器 - 负责实际构建输出文件的编译/汇编过程的一部分,包括记录此类信息的标题。
大小计算又取决于参与对象模块的数据部分包含的内容。
答案 2 :(得分:1)
您引用的维基百科文本是错误的或误导性的。在汇编或编译之前不存在任何数据段。
数据段按以下方式构建。
在汇编中,程序员可以显式声明数据部分并定义要放在那里的值。某些汇编程序还提供了在程序员使用某些功能时自动将数据添加到数据部分的功能。例如,装配线ldr r7, =345
可能要求汇编器将345放入数据部分并在ldr
指令中填写其地址。
在高级语言中,编译器在处理代码时构建所需的数据。这可以包括程序员直接编写的常量(例如345
中的x = 345;
或将高级代码转换为汇编的过程中创建的值。(例如,如果你写了i = 35; y = x[i*3+7];
},编译器可能会将下标计算为112并将其存储在数据部分中。
链接器将其处理的对象模块中的数据部分组合到一个数据段中。大小只是组合数据的大小。 (某些数据部分,例如FORTRAN公共段,可以共享,以便来自多个对象模块的数据重叠而不是连接。)
当动态加载库时,它们的数据段不能在链接时组合,它们必须由加载器单独管理。因此,执行程序可能有多个数据段。