Decorated C++(简称CDEC)的设计思路是在效率不敏感的代码域中,通过改变代码风格,辅以运行库支持,屏蔽平台相关性,使得应用代码更加关注实现而不是语法细节,提高使用C++开发功能代码的效率。
cdec包括以下组件:
- cdecegg: 库的基础,主要包含一些跨平台定义
- cdeccore:库的核心,包含常用库,如容器,字符串,IO, 编码解码,XML, JSON, 加密解密等
- stavlcommon: 工具库,包含日志,线程,时间,命令参数解等。
- mysqlcdec:基于cdec框架封装的mysqlconn库
- httpserv:基于cdec框架封装的microhttpd库
- curlcdec:基于cdec框架封装的curl库
- lzmacdec:基于cdec框架封装的lzma库
- zlibcdec:基于cdec框架封装的zlib库
- TestRunnerC:一个简单的单元测试框架,用于整个cdec库的测试
依赖关系:
- TestRunnerC不依赖于任何工程
- cdeccore依赖于cdecegg
- 其它工程都依赖于cdecegg和cdeccore
Linux 编译
- 可以对每个工程单独编译,编译时注意工程间的依赖关系
- cmake CMakeList.txt
- make
- 可以使用脚本buildall.sh对整个工程进行编译,debug版本编译后的库文件放入product/linuxd下
Windows 编译
- VS2010打开工程文件cdec.sln
- 在VS下对每个工程进行编译,编译时注意工程间的依赖关系
- debug版本编译后的文件放入product/win32d下
设计宗旨
- 在开发速度和执行速度上取得双赢
- 代码风格类似于Java(开发效率)
- 可以无缝集成标准C++(热点函数执行效率)
- 相对于多语言联合的优势
- 没有Invoke调用过程
- 无缝集成标准C++
主要组成
-
Essentail
- 引用类与GC
- 跨模块使用
- 标准化异常
- 互操作
-
支持的运行库
- 标准容器类:stringx、Array、Vector、Map
- IO:文件、目录操作;文件流和文本文件支持
- XML: SAX和DOM
- JSON: JsonParser和JsonWriter
- Text: Encoding
- Crypto: MD5、SHA1、AES、Base64
- 工具类:Converter、Math、DateTime
- 适配第三方库:microhttpd、curl、mysqlconn、lzma、zlib
- 更多运行库支持不断添加中
-
值类型 & 引用类型
- 值类型
- 标准类型:整数、浮点数、布尔等
- 指向非cdec类的指针
- stringx
- struct定义的结构体
- 总是从栈上创建,不允许动态分配
- 不允许传递值类型变量的指针,不过可以通过装箱操作来传递
- 允许在函数参数中使用引用来对外传值
- 使用专用的值类型容器,如ArrayV, VectorV等
- 引用类型
- 使用class定义的类或者interface定义的接口
- 总是直接或间接继承自Object, 接口只能继承接口或者Object
- 不允许继承多个类,但可以继承或实现多个接口
- 不允许定义拷贝构造函数,应该定义显式的Clone或类似方法来完成实例的复制
值类型示例
- 值类型
struct RECT { int Width, Height };
引用类型示例
class Region : public Object
{
DECLARE_REF_CLASS(Region)
Region(int left, int top, int width, int hegith);
...
};
ref<Region> Union(ref<Region> a, ref<Region> b);
ref<Region> a = gc_new<Region>(0, 0, 4, 4);
ref<Region> b = gc_new<Region>(2, 2, 3, 3);
ref<Region> c = Union(a, b);
接口类型示例
interface IA : public Object
{
DECLARE_REF_CLASS(IA)
virtual void FooA() = 0;
};
interface IB : public Object
{
DECLARE_REF_CLASS(IB)
vitual void FooB() = 0;
};
class MyClass : public IA, public IB
{
public:
void FooA() {...}
void FooB() {...}
};
引用对象与智能指针
ref<CdecClass> CreateCdecInstance()
{
return gc_new<CdecClass>();
}
ref<CdecClass> a = CreateCdecInstance();
shared_ptr<CppClass> CreateCppInstance()
{
return shared_ptr<CppClass>(new CppClass());
}
shared_ptr<CppClass> b = CreateCppInstance();
-
GC
- GC类型
- 简单GC, 使用reference counting控制生命周期,无法回收循环引用,附加消耗小,在无循环引用的情况下立即回收
- 完整GC,使用reference tracking控制生命周期,可以回收循环引用,附加消耗大,部分对象需要延迟回收
- cdec的GC机制
- 采用简单GC,附加简单代码风格约定,可以获得较好的性能
- 值类型完全在栈上存在
- 引用类型采用GC进行内存管理
- 非cdec对象按照标准C++规则,自行处理
- 引用和弱引用
- 引用: ref
- 弱引用:weak_ref
- 空引用常量也用NULL
- 对象创建与类型转换
- ref instance = gc_new(arguments)
- 不要在cdec对象上使用new操作
- 循环引用
- 对存在直接或间接控制本对象生命周期(管理或引用)对象的引用,采用weak_ref
- 简单泛化,引用关系全部采用weak_ref, 实例传递全部用ref
- GC类型
-
字符串
- 完全按照值类型使用
- 采用Copy-On-Write优化
- 字符串对象StringBuilder
- 引用类型,与Java、C#等价类作用相同
- 包含了字符串缓冲区,可以直接操作
- 克隆对象会复制所有有效字符串
-
foreach 语法:foreach(Type, value, enumerator) 使用条件:实现ref<IEnumerator<_Ty> > GetEnumerator()函数
示例1
ref<ArrayV<int> > arr = ...;
foreach(int, v, arr)
{
printf("%d\n", v);
}
示例2
ref<Array<MyClass> > arr = ...;
foreach(ref<MyClass>, o, arr)
{
o->DoSomthing();
}
- 标准容器
- IO
- XML
- JSON
- Crypto