C或C++不是C/C++

本文探讨了C++相对于C/C++的优势,包括使用vector替代原始数组、函数作为第一类成员的实现、智能指针简化内存管理等特性,通过实例展示了C++在效率与代码可读性上的提升。

 

C++不是C/C++ 现在很多公司招程序员都是C/C++程序员。问:C/C++是一门什么语言呢?答:C中有C++, C++中有C。比如下面一段代码:

int b[256]; 
 memset(b, 0, sizeof(b));
 for (int i = 0; i < 1000000; ++i)
 {
for (size_t j = 0; j < 256U; ++j) 
 { 
    b[j] = 10 * j; 
 }
  } 


 

一.你还在用原始数组吗?
我不明白,为什么有了vector,很多人写C++代码还是要去用原始的数组呢?(某些原因用不了vector?),

来看看vector带来的好处:

1.定义即可初始化 上面第一行和第二行很明显可以用一句 std::vector<int> b(256, 0) 替代,意思简单明了。上面memset是不是很容易就写成了memset(b, 0, 256)了呢?

2.vector变量中带有size长度,循环时不容易越界。

3.vector及其方便的改变长度(resize)。而原始数组如果长度不够,那得重新定义一个,然后手动copy到新的数组中,简直麻烦到死了。如果对其封装一下,那实际上又干了一次vector干的事情。

 

当然vector功能不仅仅如此,但是这次我是讨论是替代原始数组的所带来优势。

上段代码可以替换如下:

 std::vector<int> a(256, 0);
for (int i = 0; i < 1000000; ++i)
{
 for (size_t j = 0; j < a.size(); ++j)
 {
a[j] = 10 * j; 
 }
 }



大家可能会问到,效率呢?vector里面也是一个原始数组,封装了一层,难道不比原始数组慢?我开始也是这么想,但测试结果大大出乎我的预料。

以上两段代码我测试了一下,原始数组甚至要慢一点。编译器是g++4.3.2   -O2优化

vector版本    249 ms

原始数组版本 251 ms

二.你还在使用函数指针吗?
很遗憾,C语言在设计的时候,函数并不是设计为第一类值。C++一开始也没有,但自从boost::function(已加入标准库,现在为std::function)出现之后,C++中函数已经基本可以充当第一类值使用了。

int g(int a)
{
 return a * 10; 
} 

 int f(std::function<int (int)> callback, int a)
 { 
 return callback(a);
  } 
 std::function<int (int)> callback = g; 
f(callback, 1000);

C中函数指针的语法太复杂,我已经不记得用C怎么写了。C++表示同样的功能既简单又清晰。

 

std::function配合lambda表达式或者std::bind更为强大,C++有了函数闭包的功能


int g(shared_ptr<int> count)
{
 return ++(*count);
}
 int f() 
 {
 std::function<int (void)> counter = std::bind(&g, std::make_shared<int>(0));
std::cout << count(); 
std::cout << count();
}


 

云风在他的博客中说,没有闭包的语言很痛苦,他还想方设法给C语言加上闭包。我想说,为何不用C++?

三.你还在new指针吗?
指针是件核武器,杀敌一千自伤八百。有时指针传来传去,最后忘记了释放。智能指针的出现是C++一次飞越。


auto a = std::make_shared<int>(0);配合auto,c++代码非常简洁,性能怎么样呢?我测试过,上面这段比int*a = new int慢一倍,相比其巨大优点,速度已经足够快了。

shared_ptr并不是万能良药,使用不当会导致更严重的后果。例如,内存泄漏工具也无法检查出来。所以,我认为share_ptr带来的应该是一种语法上的工具,我们在使用它的时候应该更加理清楚变量的生命周期

 

C语言是一门伟大的语言,并不说明它是一门完美的语言。C++对其有很多改进,我们在用C++的时候不妨取其精华,去其糟粕。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值