[疑难] newsgroup上不去,来这里问几个D的问题。谢谢关注!
qyqx
2007-04-26
1.D可以用于嵌入式编程吗,有什么开销吗,也就是我可以用D写出和C一样干净的(没有额外的开销)程序吗?
2.D相对于C++的主要速度开销在哪里? 3.D相对于C++的内存布局不同在哪里? 4.GC可以手动关闭吗,怎么做?我可以完全自己控制内存分配吗? oldrev 写道 gc.disable gc.enable 4.改成:可以让GC完全不启动吗? 暂时想到这些。谢谢关注! |
|
qiezi
2007-04-26
1、嵌入编程应该是可以的,我以前以为是另外的线程在做GC,上次被提醒并没有这个线程,所以,理论上,是可以的,但DMD目前应该是不行,找一下能用GCC的嵌入环境,编译一个GDC看看,如果不行可能要打补丁了。
2、开销会比C++大吗? 3、去看一下DMD文档里的ABI部分 4、在windows上用-gui编译时应该就没有启动GC,DMD/sample里面的例子使用的是.def文件,这时候你需要在WinMain里面自己处理GC的启动和关闭。gc.disable就已经让它不起作用了,它又没有另开线程,有什么影响吗?实在对于它占有的那么点内存也看不过眼的话,自己写GC吧,可以在运行时替换的,不过你的洁癖真的这么严重吗? |
|
qyqx
2007-04-26
1.1“编译一个GDC看看,如果不行可能要打补丁了。”
是指给GDC打补丁吗? 1.2 “我可以用D写出和C一样干净的(没有额外的开销)程序吗” 好像一定会初始化,要靠编译器的实现来回避。 可是大数组的初始化还是很耗时间的呀。 谢谢回答。 |
|
qiezi
2007-04-26
打补丁当然是对编译器和库了,这两者有些关联。如果你的平台不支持线程,去除线程相关的东西,线程部分自己实现一个空的。
避免大数组的初始化: char[1024 * 1024 * 2] buf = void; 我不知道你还有没有类似的问题,最好先搞清楚要不要那么麻烦。如果不用GC,干嘛要用D呢?如果要用GC,干嘛用C/C++呢?它们对于GC的支持态度都比较鲜明,非要强制转到另一种,用起来也很痛苦,需要注意的地方太多了。 |
|
qiezi
2007-04-26
另外在嵌入平台上可能很多东西是使用栈的,分配类对象可以使用scope,它在栈上分配并且不调用分配器。定长数组应该也是在栈上分配的。
|
|
qiezi
2007-04-26
http://digitalmars.com/d/memory.html
这里讲了大部分内存相关的东西,应该是嵌入平台主要考虑的吧。 另外注意一点,前段时间在论坛上看到说D支持数组的COW,这个应该是错误的,D本身是不支持的,COW是要实现(库)来做的。语言支持COW本身就有些过份。 |
|
oldrev
2007-04-26
GC是可以完全不用的,只要你完全没用到。但是这很困难,你无法使用 phobos,而且不能链接到D运行时。
.net compact 都不怕GC啊 |
|
oldrev
2007-04-26
D最少要求32位的处理器和flat内存模型,这是在语言里就定下来的了,所以楼主的平台是8052之类的就不要考虑了。32位的CPU的性能用GC肯定是没问题的,手机上还能用java呢。
|
|
highwing
2007-04-26
在windows上用-gui编译时应该就没有启动GC?
这个有些疑惑,如果代码象DWT程序那样,是从main()开始的,用-gui编译会启动GC吗?怎么比较方便的查看是不是启动了GC呢? |
|
qiezi
2007-04-26
highwing 写道 在windows上用-gui编译时应该就没有启动GC?
这个有些疑惑,如果代码象DWT程序那样,是从main()开始的,用-gui编译会启动GC吗?怎么比较方便的查看是不是启动了GC呢? -gui把函数入口指定成WinMain了,好像也有另外的方式指定。由于没有调用main,所以_Dmain就没有调用,而gc的初始化、结束都是在这里做的。 如果你使用WinMain,你要自己处理GC,看这里: http://digitalmars.com/d/windows.html |