用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.
哪位大大知道,还请告知.不限编译器...(我搭的框架基本上是可以跨平台的)
...全文
982 59 打赏 收藏 转发到动态 举报
写回复
用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,209

社区成员

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

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