请问C的runtime到底在程序运行期做了什么

code_tin 2006-04-27 11:29:13
C的runtime虽然提供了最少的执行期函数,但是仍旧作为C编译出后的程序运行的基础
我在看学习<C专家编程>第六章执行期什么的时候记得一句话
程序在runtime所控制的内存下
对这句话不是很理解
意思是说C的程序在调用malloc和free都是通过runtime的呢.还是怎样的?
还有C程序里面的堆栈管理,
是插入到生成后的程序中,还是由runtime控制?
比如调用函数负责参数的入栈和返回地址的入栈
这块内容是由runtime在执行期来做的
还是由编译器后端在生成的时候插入每个函数的末端的?
由于本人汇编不行,所以没法自己验证.

本题绝对会在我知道答案之后散分.
...全文
290 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
code_tin 2006-04-28
  • 打赏
  • 举报
回复
UGG回帖非常仔细,我很感谢

因为这个问题很难描述,我的表达也有问题
所以可能大家对这个问题本身理解的也不是很能理解

UGG回答的一些问题都是我已经知道的问题。
对于函数调用,数据保存位置,执行文件的segment,执行文件载入内存后的堆以及栈的存放位置以及增长方向等等内容,本人都是已经了解的

可能我的问题就和我上面写的一样

问题在于为什么需要 runtime库才可以正常执行
如果我静态编译,那么所有的东西应该都直接编译成为机器指令保存在最后的可执行文件中
比如malloc这样的函数,最终应该都会编译成相应环境的机器指令
而现在的程序无论是静态编译还是调用动态库,都需要runtime支持
code_tin 2006-04-28
  • 打赏
  • 举报
回复
问题在于为什么需要 runtime库才可以正常执行
如果我静态编译,那么所有的东西应该都直接编译成为机器指令保存在最后的可执行文件中
比如malloc这样的函数,最终应该都会编译成相应环境的机器指令
而现在的程序无论是静态编译还是调用动态库,都需要runtime支持
逸学堂 2006-04-28
  • 打赏
  • 举报
回复
意思是说C的程序在调用malloc和free都是通过runtime的呢.还是怎样的?
~~~~~~~
这是在运行期间申请内存,更准确的说是在堆上申请内存。关键是此时申请的内存
空间大小是在运行时刻决定的。
比如
char a[num]; // 如果此时的num只是一个普通变量,需要在运行时赋值。那么这个语句是不能
// 通过编译。这可以理解为编译时刻确定申请空间大小,所以此时的num只能是const变量或者宏// 或者其他能在编译时刻确定num数值的变量类型。这里涉及的问题就是栈分配。
char *p = new char[num]; // 而这里的num不存在上面说道不能使用的情况,无论num是static,const,普通变量类型,都没有问题,可以编译通过。但是如果num时负值或者其他错误值,那么这条语句将会在运行时刻发生错误。

还有C程序里面的堆栈管理,
是插入到生成后的程序中,还是由runtime控制?
~~~~~~
堆和栈是两个不同的概念。地址增长方向正好相反。比如函数调用,函数内的非malloc变量空间申请都是在栈上完成,栈上申请空间大小,一个显著特点就是变量空间的大小必须确定。栈的另一个特点是先进后出,可以理解为线性的。这部分空间有系统管理。而堆,在堆上申请的空间需要用户自己管理,即通过malloc申请,通过free释放,如果这么部分只是malloc而没有free就会造成内存泄漏。

比如调用函数负责参数的入栈和返回地址的入栈
这块内容是由runtime在执行期来做的
还是由编译器后端在生成的时候插入每个函数的末端的?
由于本人汇编不行,所以没法自己验证.
jixingzhong 2006-04-28
  • 打赏
  • 举报
回复
引用:
蒋晟[MVP](jiangsheng)

A runtime library is a collection of utility functions which support a program while it is running, working with the operating system to provide facilities such as mathematical functions, input and output. These make it unnecessary for programmers to continually rewrite basic capabilities specified in a programming language or provided by an operating system



铖邑 2006-04-28
  • 打赏
  • 举报
回复
入栈 出栈这是编译器编译成机器语言里面产生的机器指令,不知道楼主在困惑什么,摸不着头脑
jixingzhong 2006-04-28
  • 打赏
  • 举报
回复
程序编译后的代码,
需要 runtime库才可以正常执行 ...

楼主提到的是 runtime 的功能之一: 内存的管理
TERRYYRRET 2006-04-28
  • 打赏
  • 举报
回复
学习
Capricorn 2006-04-28
  • 打赏
  • 举报
回复
库是在解释层工作的。
所以所有的代码最终都还离不开运行库。
当然,最底层是编译后的库代码在与硬件实现机理打交道。
yuanchuang 2006-04-28
  • 打赏
  • 举报
回复
做什么吗?好像C里面没有吧。
我没看过,只是瞎说
yuyuxiaoyu 2006-04-28
  • 打赏
  • 举报
回复
具体情况具体分析拉,拿个例子来看下就晓得了.
code_tin 2006-04-28
  • 打赏
  • 举报
回复
爲了詳細了解這方面的内容
可能牽涉到操作系統以及編譯原理
所以我再提高100分
code_tin 2006-04-28
  • 打赏
  • 举报
回复
>>你可以选择在连接时自己定义入口点函数,
如果在代码中没有调用 C 运行期的函数,
则完全不用连接 C 库.

如果這麽說我寫一個純空的mian編譯以後運行的話是完全不會去調用runtime?
還有C庫函數是調用API的
但是C runtime呢?我聼別人說反而是API調用runtime的
我也覺得這個説法有些問題.
kangde 2006-04-28
  • 打赏
  • 举报
回复
为什么没有CRT, mai不会被调用
----------------------------
编译器提供了一个目标文件, 形如 crt0.obj 样子,
不同编译器供应商提供的名字也有差异.
一个win PE 程序要有一个入口点,
OS才可以知道从哪里开始执行.
当一个C程序编译时, 默认的入口点为 _MainCRTentry样子,
这个函数就是定义并实现在 crt0.obj(s) 中,
在 _MainCRTentry中调用了外部的 main() 函数,
所以你要提供 main 的实现才行.
你可以选择在连接时自己定义入口点函数,
如果在代码中没有调用 C 运行期的函数,
则完全不用连接 C 库.

那么那个 _MainCRTentry 在调用 main 之前都干了些什么呢?
mingw 中的主要是处理命令行参数, 设置SEH-结构化异常帧.

win 操作系统的编程接口- win32 api, native api, 以及自己用手挖出来的函数(undocumented),
所有的C库函数, 要么调用这些 API, 要么使用汇编来实现.
zidane_yubo 2006-04-28
  • 打赏
  • 举报
回复
mark 高人啊
code_tin 2006-04-28
  • 打赏
  • 举报
回复
to Wolf0403(完美废人·不配奢求幸福):
>>程序中栈的维护通常是由 CPU 和 OS 共同完成的

好像不是吧,因为不用语言所出来的函数调用规则
栈的维护可能由调用函数来做,也可能由被调用函数来做.
从这个角度来说,各种语言的实现就是不同的.如果由OS来决定
那么同一个OS里面的维护规则应该都是一致的,不存在不同语言有不同现场保护规则一说了.
还有刚刚翻看了<C++高效编程>一书
里面的第八章 函数 P126 里面的调用函数所产生的汇编代码包括了入栈操作
说明现场保护由调用函数来做(与其他C语言书描述一致)
并且保护很可能是由可执行程序自己来实现的,而不是由RUNTIME来做的.
不论如何,非常感谢回帖.会给分的

to lovefreex(沉默的羔羊):
感觉大致说到点上了.能否说的再详细点?为什么没有CRT,main不会被调用?
编译成二进制文件以后不可以直接用jmp转跳到main所在位置么?
如果能说的更详细一点我愿意另外再给30~50不等
Wolf0403 2006-04-28
  • 打赏
  • 举报
回复
C 程序执行时调用的所有 C 函数都来自于这个 runtime library。runtime library 负责在适当的时候沟通操作系统(切入内核模式执行系统调用)。

程序中栈的维护通常是由 CPU 和 OS 共同完成的,不属于 CRT 的职责(GCC 的 alloca 系列除外)
lovefreex 2006-04-28
  • 打赏
  • 举报
回复
C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧