C++真的是静态数据类型语言吗?

3000阅读 0评论2014-09-21 尘世间一迷途小码农
分类:C/C++

C++爱好者在和pythonphp粉丝骂战时,经常会碰到一个难题“你们c++不支持动态数据类型,会大幅降低开发效率”


C++的语法要求在编译时确定变量的类型,属于静态数据类型语言。

静态数据类型的好处是在编程时一旦类型出错(例如对int变量写入string值),会在编译时报错。一旦编译通过,基本就不会存在类型错误的bug了。对于数万行的大型软件,在核心部分采用静态数据类型会更易于维护。


而支持动态数据类型的语言可以在运行时随意更改变量类型。

在实现多层map、制作可变参数通用api等几种情况下,动态数据类型可以大幅提高开发效率。


让我们来看一个小例子:
      
假如我们要在lua里写一个三层table,大概是这样:

  1. data = {}
  2. data["key1"] = {}
  3. data["key1"]["key2"] = {}
  4. data["key1"]["key2"]["key3"] = "邓小超"
      然后查找的时候:
  1. if data["key1"] ~= nil and data["key1"]["key2"] ~= nil then
  2.      print(data["key1"]["key2"]["key3"])
  3. end

假如我们要在c++里干这件事,大概是: 

  1.     map<string, map<string, map<string, string> > > data;
  2.     map<string, map<string, map<string, string> > >::iterator it_1 = data.find("key1");
  3.     if(it_1 != data.end())
  4.     {
  5.         map<string, map<string, string> >::iterator it_2 = it_1->second.find("key2");
  6.         if(it_2 != it_1->second.end())
  7.         {
  8.             map<string, string>::iterator it_3 = it_2->second.find("key3");
  9.             if(it_3 != it_2->second.end())
  10.                 printf("%s\n", it_3->second.c_str());
  11.         }
  12.     }

      光看看就觉得郁闷。

这还仅仅是最简单的情况,如果在key1下还有key2_1key2_2....... 基本上只能跑去定义一堆struct了

噢,杀了我吧,太他妈复杂了。


通过引入jsoncpp库,我们可以这样做:

  1. try
  2. {
  3.         Json::Value data;
  4.         data["key1"]["key2"]["key3"] = "邓小超";
  5.         printf("%s\n", data["key1"]["key2"]["key3"].asCString());
  6. }
  7. catch(...)
  8. {
  9.         printf("some data missed\n");
  10. }


C++居然能使用动态数据类型了!!!这不科学!!!
 

C++的语法虽然要求我们在编译时确定数据类型。但是我们可以用指针指向任意类型的数据,从而避开编译时的检查。例如多态就是利用了虚指针来支持运行时调用不同的子类成员函数。

      更进一步,可以通过指针加类型让c++支持动态数据类型。

  1. class auto_type
  2. {
  3.     void *point;
  4.     int type;
  5. public:
  6.     //各种函数,通过type判断类型,然后处理point指向的数据
  7. }

jsoncpp库利用类似的原理,让我们可以在运行时动态的指定数据类型,相当于让C++支持了动态数据类型。

性能上jsoncpp会比直接使用intstringmapvector要低,但是比起脚本语言还是要高上数倍。

上一篇:定制linux内存管理
下一篇:并行服务器真的比串行快吗?