posts - 18,  comments - 104,  trackbacks - 0
re: C++下垃圾回收器的实现(一) 尹东斐 2010-02-08 17:25
@Bill Gates

我之前提到这个Hans_Boehm GC, 它由于是Conservative Garbage Collector,所以没有办法证明其绝对安全。

他的算法通过指针的地址判断指针是否在堆上,重载全局new以后,他控制了所有内存分配,他知道堆上最小的地址和最大的地址,然后通过判断指针的地址是否落在在个区域内部来判断这个指针在堆上还是栈上。

这种方法没办法实现内存紧缩的功能。

还有,在工程中,用到其他库的的时候都会考虑包装,一般不会直接使用,加一个间接层,即使它的内存不完全由你控制,但是你还是可以部分控制的。
re: 自动求导模板库 尹东斐 2009-12-07 11:10
下载的文件放在和其他程序文件相同的目录下,然后#include“ad.h”
要不你可以放在其他文件下,然后#include “xxx/ad.h"

具体用法参见前面的example。
@wulin

不需要考虑存储程序的空间,因为数据和程序在内存中完全没有区别。所以从某种角度来看,程序也是数据的一种。
比如:
class A
{
public:
int i;
};

VL_BEGIN_INSPECTOR_DECLARATION
VL_BEGIN_BASE_CLASS(A)
VL_ADD_CLASS_MEMBER(i)
VL_END_CLASS(A)
VL_END_INSPECTOR_DECLARATION

A a;

现在我要通过类似 int x = func(a, "i"); 来的到a中i的值,那这个时候,怎么知道i的类型呢?也就是说func的返回值是从哪里来的?

不吝赐教~
@陈梓瀚(vczh)

>>VL_ADD_CLASS_MEMBER(Weight)可以得到Weight的类型,这个用模板就可以了。

这个用模板也做不到吧? 除非有typeof之类的操作符,否则拿不到类型的呀。
这实现看起来很有诱惑力 :0

有点不太懂,请指教:

136 VL_BEGIN_BASE_CLASS(Animal)
137 VL_ADD_CLASS_MEMBER(Age)
138 VL_ADD_CLASS_MEMBER(Weight)
139 VL_END_CLASS(Animal)

在VL_ADD_CLASS_MEMBER的时候,没有涉及到成员的类型,那么当读取数据的时候,类型是怎么得到的?

GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,Type.Object()));

你在这里用到了Type.Object(),我想问你是不是把所有类型都包装起来了,相当于每个类型都有个get_type()之类的方法,如果你是这么实现的,那就没有问题了。如果不是的话,

197 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(L"VL_ObjectType");

188 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(VL_InspectorSelector<Animal>::GetID());

我想这两句的作用应该是一样的,只不过VL_InspectorSelector<Animal>是在宏里面特化的,L"VL_ObjectType"是你为所有“内建”类型写的。

难道Inspector里面包含有每个成员的类型?
re: 类实例能做做模板参数吗? 尹东斐 2009-06-04 23:52
@hdqqq

嗯,谢谢,领教了。
re: 类实例能做做模板参数吗? 尹东斐 2009-06-02 20:20
@hdqqq

楼上eXile说了,这个类型是叫函数类型的,但是它不能被实例化。也就是你的type_func。
@飘飘白云

我只是觉得这个rvalue reference是最重要的特性,可以不知不觉的增加效率,所以就决定写点什么。
恩,你全文翻译了,敬佩中,这三篇虽然看了,我觉得rvalue reference比较有意思。

当然楼上说这些特性微不足道,是因为他还没到能看出来这些特性强大之处的境界~~

不过不知道为啥vc10不支持conception,这个鄙人认为是最强大的特性之一了,有了这个,就可以和那种上百KB的error message说再见了。
re: 类实例能做做模板参数吗? 尹东斐 2009-05-27 14:04
@hdqqq

在模板的位置上,它的确是个类型,但是我不知道你想说明什么?

整篇文章,我都在尝试说明在模板参数的位置上,std::string()只是个标记,纯粹用作类型推导,只是这种写法很容易会误导人让人认为那是个构造函数。而这个误导源自于 return type deduction,因为在新的C++0x中,可能会有

int Test()
{
return 3;
}

type(Test()) i = 8;

如果这个被实现的话(vs2010已经有auto了,我想这个应该不远了).编译器可以做返回类型推导,那么在模板参数的位置上,写函数调用也就不足为奇了。

所以,这篇文章主要想说明,到目前为止,函数返回类型是推导不出来,而类似std::string()的写法只是个折中方案而已。

当然不是构造函数调用。
re: 类实例能做做模板参数吗? 尹东斐 2009-05-25 19:08
@hyrish

你说的那种是函数模板,函数模板的模板参数可以靠编译器自动推导,以类型明确的变量为基础。而在类模板中,只能事先声明,然后使用,编译器无法推导。
这个解法很好,在lambda没有诞生之前,c++只能这么写,很折磨人。
如果用boost::lambda的话,这个问题就可以写成:

map<int, int> testMap;
testMap[1] = 3;
testMap[2] = 3;
testMap[4] = 3;
testMap[6] = 3;

int nCount = count_if(testMap.begin(), testMap.end(), bind(&pair<const int, int>::first, _1) < 5); // nCount == 3.
我觉得这个可以考虑重新定义一个
template <class T, int N>
class my_allocator
: public allocator<T>
{
//按照N分配空间
};

template <int N>
class my_string
: public basic_string<char, char_traits<char>, my_allocator<char, N> >
{};

这样子实现起来,不用考虑异常安全等问题,标准库会考虑这个,因为allocator的实现比起string来,简单多了。
re: boost::shared_ptr 的 cast 尹东斐 2009-05-01 23:25
@陈梓瀚(vczh)

嗯,谢谢提醒,我理解有问题。
re: std::endl 是什么? 尹东斐 2009-04-18 21:08
@OwnWaterloo

嗯,就是这样子的。
其实可以直接从basic_ostream继承,然后把stream_buf改成自己想要的输出方式就可以。
都不知道FPU还能直接算sin,cos,太牛了。
@Sandy

对的,我犯错误了。 public要放前面。
像Sunshine Alike的编译器报的错就有点奇怪,private指的是access不可见的。
@Sunshine Alike
不好意思,public 应该放前面。

codeblocks 的编译错误有点奇怪的说,因为private的东西对子类来说是可见的,就是是private的,也不至于'base' has not been declared,很奇怪。
@路人丁
我尝试两个编译器VS2005 & VS2008,不知道你的编译器怎么样?
很赞。
我自从看了 C++ Templates are Turing Complete 以后,觉得很汗~
这些大牛们都已经在理论上证明c++ template是图灵机等价的,也就是说可以在编译器做任何想做的事,就对研究模板失去了兴趣。
感叹,模板的技法实在太少了,这么长的代码,大部分都在重复,真期待0x赶紧到来,可以在模板中使用 <...> .
多交流吧。
re: Pascal简化版 尹东斐 2009-04-09 23:44
不错,如果结构设计的好的话,扩展可支持的类型,添加新的功能是很容易的。
如果你有scope的概念的话,增加函数功能也很容易。

加油。
@陈梓瀚(vczh)

很精辟,赞。
@蔡芳钧
@wulin

欢迎来顶 : )
@jans2002

模板现在是不好调试,不过好像VC 10的 intellisence 会有帮助吧。 还没有用过。

我目前的水平主要还是自己推,不知道大牛们玩模板是不是和咱写程序一样轻松。。。
@ebenzhang

boost::any的实现中,用type_info配合static来做类型检查。
所以我说他用RTTI。

我意思是不想通过使用 typeid 获得 type_info,从而检查类型。

我没有说清楚,谢谢提醒。
@lwan

这里还是要动静结合的,所有cast都是运行期做的事情。在编译期,能用的运算型关键字少得可怜,像 sizeof 这种。所以有必要的时候,可以借助运行期的特性。

静态还是为动态服务的,不必在他们之间画出一条道来,从此不往来。只要能尽可能的解决问题,并优雅,高效就是王道。
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(4)

随笔档案

文章分类

文章档案

相册

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜