程序的一些小优化

        跳槽后才真正接触了C++,之前囫囵吞枣看了些C++的书,但是发现真正在项目使用时,很多地方都有改进的地方。

1.vector的resize:

        场景是这样的,客户端向服务器发起查询符合某个条件的数据库记录的请求,服务器查询完后将记录返回给移动端。服务器查询到数据记录后,将记录放入vector中,最开始的做法是向一个vector对象不断push记录,由于测试的时候查询的记录数都只有几百或者1000来个,push耗时不太久。后来有一天老板说,为什么我用手机查询xxx时,耗时5~6秒这么久,于是跟组长一起跟踪代码,没错,不过组长的经验的确比我这种菜鸟要丰富得多,一下就定位了慢的地方了。他说,查询到的记录数已知,就可以先resize,然后使用operator[]和循环将记录赋值。修改后,查询耗时只有300多毫秒。另外,还扩展学习了reserve和resize的区别,前者改变vector对象的capacity,但是size不改变,即reserve操作过后,预留空间变大了,但是没有构造新的对象,这时是不能使用operator[]的,后者既改变vector对象的capacity,又改变size,使用resize后,可以使用operator[]赋值。

2.operator=:

        很多时候,在一个循环中,我们需要从一个vector<string>中取出字符串进行处理:

for (auto it = vecStr.begin(); it != vecStr.end(); ++it) {
        std::string str = *it;
        // do something
}
        每循环一次,循环体里的赋值操作都会构造一次,析构一次,如果循环次数少,且vecStr的每个元素长度都比较小,那么开销不大,如果二者都不满足,这个开销是相当大的,这时,使用引用会更好一些,它只是str分配的内存的别称,不占用任何空间,跟指针操作差不多,开销大大减少。

3.使用ODB封装SQL语句的问题:

        什么是ODB?官方的介绍:ODB is an open-source, cross-platform, and cross-database object-relational mapping (ORM) system for C++. 意思就是它把关系型数据库中某个表的各列都视为一个类的一个成员,然后将这个类的成员映射为这个表中的列,ODB忽略类的成员函数,所以类的成员函数可以定义各种对这个表的操作,例如插入,删除,查询等等。通过ODB,我们不用再写SQL语句,也不用再写跟某个数据库有关的SQL语句,ODB将它们全部翻译为C++的逻辑语言,如:

SELECT * FROM tbTest WHERE employee = 'John'
它会被翻译为类似xxx<tbTest>.query(xxx<tbTest>::employee == "John")的C++语句。但是,有个问题,ODB对查询单列的数据记录支持不好,只能返回符合条件的全部记录列,然后我们再对返回的全部数据取出某一列的数据进行处理。怎么处理呢?定义一个GetDistinctXXXList的方法:

int GetDistinctXXXList( I begin, I end, std::function<std::shared_ptr<void>(const T& )> cb_fun, /* others output parameters */);

其中cb_fun是在某个表对应的类里定义的一个回调函数,begin和end是已经返回的所有记录的开始和结束的对象迭代器,所以要如何处理就取决于cb_fun了。

4.隐式类型转换

        假设有一个函数定义为:void DoSth(const std::string& str);

        那么在使用时,DoSth("hello world");是可以编译执行的,在运行时,会构造一个匿名的std::string("hello world")对象,使用完后,再被析构。这在循环中使用时,可能造成很性能下降。

5.using namespace xxx;

        在很多程序中都可以看到这个导出命名空间的用法,但是<<C++ Primer>>建议不要这么使用的,这会导致:

        a.编译时,遇到调用一个存在于不同的命名空间的同名函数的地方不知道使用哪个函数,例如std中有一个DoSth,而我们在自己的命名空间中定义了一个同名的DoSth,并且将它导出了。

        b.这种方法会将自定义的命名空间的全部函数导出,这可能不是一个好的方法。例如我们并不想导出我们命名空间中的一个函数DoSth。

        推荐的写法是:using spacename::func;

        例如:

using std::cin;
using std::cout;
using std::endl;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值