用C++实现了一部分CRT,不想写了,开源给大家参考参考~~~

redleaves 2010-06-04 10:52:06
如题... 下载地址

包里包含了VC9的可执行程序,我的开发环境,我实现的全部CRT代码,和测试代码.
实现了单线程的静态库.目前只支持可执行程序的入口.

实现的功能有:

1.CRT及C++的初始化,清理.
2.基本的内存管理(直接转发WIN32接口,我什么都没做^_^)
3.基本的文件流(只实现了一部分).
4.一部分字符串操作函数.
5.CRT的SEH支持.
6.C++异常支持.
7.对可变参数的支持.
8.CRT中long long/unsigned long long的支持函数.

基本上,CRT实现中的拌脚石都已经清除了.剩下的多半是体力活了...

其中,异常处理的实现部分是独此一份...
因为MS的CRT源代码里没有这些.网上也找不到相关实现代码.比较有参考意义.
VC的long long系列函数性能比较有问题.我在这里重新实现了这部分代码.
跑我的测试代码,性能是VC自带库的3倍.

另外,alloca要stack frame支持,但我还没搞清楚加什么修饰能强制让编译器在调用alloca时生成stack frame.
哪位大大知道,还请告知.不限编译器...(我搭的框架基本上是可以跨平台的)
...全文
972 59 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyzqqq 2011-01-03
  • 打赏
  • 举报
回复
redleaves 2010-06-14
  • 打赏
  • 举报
回复
另外,补充一下,我的异常处理也有BUG....
改正代码如下:
static void _local_unwind2( VC_EXCEPTION_REGISTRATION* _Frame,  int argTryLevel ) {
int nTryLevel , nPrevTryLevel;
__try {
while( _Frame->trylevel != 0xFFFFFFFF ) {
nTryLevel = _Frame->trylevel;

if ( argTryLevel!=0xFFFFFFF && nTryLevel <= argTryLevel ) {
return;
}

_Frame->trylevel = nPrevTryLevel = _Frame->scopetable[nTryLevel].previousTryLevel;

if ( _Frame->scopetable[nTryLevel].lpfnFilter ) {
continue;
}

int tmp = (int)&_Frame->_ebp;
FARPROC handler = _Frame->scopetable[nTryLevel].lpfnHandler;
__asm {
mov eax, handler
push ebp
mov ebp, tmp
call eax
pop ebp
}
}

} __except(NestedExceptionHandler()) {}
}
redleaves 2010-06-14
  • 打赏
  • 举报
回复
我刚才看了下楼上给的那个代码.
他是hack的C库的异常处理.然后把所有的异常用他自己的方式来搞的.实现了SEH的异常处理.
C++异常只是把入口转向自己的处理函数,然后按SEH那样搞了一下.
不过C++异常处理的不对.如果异常的对象有一些继承关系.它的代码就不正确了...

我写的异常实现是按MS的CRT的方式来搞的.和那个代码路子不太一样...
sevencat 2010-06-14
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/exception/excv2.aspx
不知道这个算不算处理异常的代码...
redleaves 2010-06-14
  • 打赏
  • 举报
回复
应该不完全是重复工作吧?
至少.最起码VC处理C/C++异常以及SEH的代码.在网上肯定是没有的.
其实,就学习而言,重复前人的工作.是完全必要的.

不过我的主要目的是为了做个给自己用的C库...要不我在不同平台的代码要做无数的walkaround...
而且我还考虑让这个库的大多数基本功能做到完全的平台无关.这样,这个库就可以直接放到OS的内核里用了.这样,我在研究内核的时候,就有现成的C库用了^_^
linglongyouzhi 2010-06-14
  • 打赏
  • 举报
回复
为什么要重复工作呢
贪食蛇男 2010-06-14
  • 打赏
  • 举报
回复
牛B,受俺一拜,去看看。
sevencat 2010-06-14
  • 打赏
  • 举报
回复
http://www.uclibc.org/
sevencat 2010-06-14
  • 打赏
  • 举报
回复
支持楼主重发明轮子!!
http://www.codeproject.com/KB/library/tlibc.aspx
redleaves 2010-06-14
  • 打赏
  • 举报
回复
不是这个.你可以测试一下. 比如:
void a() {
...
void *p = alloca(10)
...
}
编译器会为a这个函数自动产生stack frame.
如果不调用alloca,那这个stack frame就有可能被优化掉.
也就是说,alloca这个函数在定义的时候,被赋予了一种属性,这个属性会指示编译器,在调用这个函数时,为调用者强制产生stack frame.不同的编译器,写法可能不太一样.但我没找到相关的资料.
「已注销」 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 redleaves 的回复:]

引用 45 楼 loaden 的回复:

引用 33 楼 redleaves 的回复:

为啥没人回答我最后的疑问?

啥疑问?
加什么修饰能强制让编译器在调用alloca时生成stack frame.
这个
[/Quote]
你问的是编译选项吧:防止缓冲区溢出?
不明白你的。试下/GL
redleaves 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 loaden 的回复:]

引用 33 楼 redleaves 的回复:

为啥没人回答我最后的疑问?

啥疑问?
[/Quote]加什么修饰能强制让编译器在调用alloca时生成stack frame.
这个
Eleven 2010-06-14
  • 打赏
  • 举报
回复
NX。。。
liutengfeigo 2010-06-14
  • 打赏
  • 举报
回复
「已注销」 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 redleaves 的回复:]

为啥没人回答我最后的疑问?
[/Quote]
啥疑问?
帅得不敢出门 2010-06-11
  • 打赏
  • 举报
回复
哦 顶一个
wh_xiao 2010-06-11
  • 打赏
  • 举报
回复
mark
DaveLee001 2010-06-10
  • 打赏
  • 举报
回复
真厉害!佩服
  • 打赏
  • 举报
回复
只能围观。。
ddsaewq 2010-06-10
  • 打赏
  • 举报
回复
谢谢楼主啊
加载更多回复(38)
miniblink是什么? Miniblink是一个追求极致小巧的浏览器内核项目,全世界第三大流行的浏览器内核控件。 其基于chromium最新版内核,去除了chromium所有多余的部件,只保留最基本的排版引擎blink。 Miniblink保持了10M左右的极简大小,是所有同类产品最小的体积,同时支持windows xp、npapi。 为什么要做miniblink? 市面上作为嵌入的组件的可用的浏览器内核,不外乎这几个:webkit、cef、nwjs、electron。 cef:优点是由于集成的chromium内核,所以对H5支持的很全,同时因为使用的人也多,各种教程、示例,资源很多。但缺点很明显,太大了。最新的cef已经夸张到了100多M,还要带一堆的文件。同时新的cef已经不支持xp了(chromium对应版本是M49)。而且由于是多进程架构,对资源的消耗也很夸张。如果只是想做个小软件,一坨文件需要带上、超大的安装包,显然不能忍受。 nwjs,或者最近大火的electron:和cef内核类似,都是chromium内核。缺点和cef一模一样。优点是由于可以使用nodejs的资源,同时又自带了各种api的绑定,所以可以用的周边资源非常丰富;而基于js的开发方案,使得前端很容易上手。所以最近N多项目都是基于nwjs或electron来实现。例如vscode,atom等等。 原版webkit:现在官网还在更新windows port,但显然漫不在心,而且最新的webkit也很大了,超过20几M。最关键的是,周边资源很少,几乎没人再基于webkit来做开发。同时由于windows版的saferi已经停止开发了,所以用webkit就用不了他的dev tools了。这是个大遗憾。 WKE:这是个很老的webkit内核的裁剪版了。小是小,但bug太多了。 那么关键点来了,使用miniblink有啥好处呢?? 首先,miniblink对大小要求非常严格。原版chromium、blink里对排版渲染没啥大用的如音视频全都被砍了,只专注于网页的排版和渲染。甚至为了裁剪大小,我不惜使用vc6的crt来跑mininblink(见我上篇文章)。这个也算前无古人后无来者了。 其次,miniblink紧跟最新chromium,这意味着chromium相关的资源都可以利用。在未来的规划里,我是打算把electron的接口也加上的,这样可以无缝替换electron。使用miniblink的话,开发调试时用原版electron,发布的时候再替换掉那些dll,直接可以无缝切换,非常方便。 miniblink如何使用? Miniblink导出了electron、WKE的接口,可以直接无缝替换现有的electron、WKE项目。 早期miniblink还导出了CEF接口,不过现在已被废弃。 miniblink有个小demo,从demo里可以看到,brackct这个基于cef的开源编辑器,已经顺利由miniblink跑起来了。现在electron的接口已做好,vscode跑起来了。 更详细的使用文档见本页其他文章。 miniblink如何裁剪到这么小? 这个比较复杂了。主要就是把blink从chromium抽离了出来,同时补上了cc层(硬件渲染层)。现在的blink,已经不是当年的那个webkit了,渲染部分全走cc层,复杂无比。我这大半年都在重他那个蛋疼又复杂的cc层。 和webkit比,miniblink架构有什么优势 现在的webkit版本,已经比miniblink落后太多了。blink一直在加入各种极富创造力和想象力的功能、组件。例如,blink早就加入多线程解析html token、blink gc回收器、多线程录制回放渲染机制。这些能让blink的解析渲染速度极大提升。下一次,我会先开源出blink gc组件,这东西很有意思,在c++里硬是搞出了一个垃圾回收机制,能让你像java一样c++

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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