免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: myworkstation
打印 上一主题 下一主题

[C++] 【有奖讨论】随着 C++11 的巨大变化,谈谈你对新STL的展望 [复制链接]

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
1 [报告]
发表于 2015-06-19 12:36 来自手机 |显示全部楼层
我个人觉得c++的定位,定位很尴尬。其次是ABI兼容性差,各个平台库不统一,c++在应用开发上还是有很多大厂商在用,MS,GOOGLE。android native层很大部分代码使用C++开发。

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
2 [报告]
发表于 2015-06-24 22:50 来自手机 |显示全部楼层
本帖最后由 shenlanyouyu 于 2015-06-24 23:02 编辑

1、你是否完整的了解过C++98: 2003 标准下的STL设计和实现,并且对你产生了怎么样的影响?
看过一部分,当时是看候老师的源码剖析。影响在于学习到如何用C++实现设计模式,例如迭代器模式。泛型程序设计思想,采用模板机制,实现代码的复用。

2、你是否认同在开发同应该尽量使用STL,而不是自信的经常重复造轮子?
STL是具有工业级别强度的标准库,能够提高开发效率。重复造轮子反而更容易埋下bug。我是没有那个自信来重复造轮子。我觉得比较好的方法,我自己也是这样做的,对STL再封装,来满足实际的需求。

3、你对C++11标准下的STL有什么样的期望,新的STL特性目前有使用吗?
C++ 11引入了Boost库中的一些函数和类。

4、对你来讲STL还有哪些是急需改进的地方。
存在的问题STL大量使用模板机制,容易代码膨胀,模板机制带来的重复实例化,编译时间过长,编译后code size过大。内存使用率低,还需要优化,例如深拷贝问题,两个容器实例赋值,就会涉及到容器元素的拷贝。

5、对于STL的未来你的预期是什么样的?
好吧,C++越来越学院派了,新标准推进速度不理想,很多新功能都没有用上。 STL的问题在于API的兼容性,不同平台采用不同的C++库,Windows的visual studio采用MS 自己的标准库,linux平台上是一套,google的android使用的是自己实现的bionic。同一个程序在不同平台上执行结果不同。
例如:
#include <iostream>
using namespace std;
int main()
{
     string test;
     int size = sizeof(test);
     cout<<"size is "<<size;
     return 0;
}
在linux平台执行结果为4,而在visual studio 2012中执行结果为28。希望能够有一个统一的标准库。

评分

参与人数 1可用积分 +12 收起 理由
王楠w_n + 12 赞一个!

查看全部评分

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
3 [报告]
发表于 2015-06-26 10:47 来自手机 |显示全部楼层
论坛是大家讨论学习的地方,有不同意见请阐述出来,但是请注意你的语气。不要一上来就喷,把论坛当成你发泄生活不满的地方。在我的回复中没有任何吐槽Stl,关于编译器我用过vc6,vs2005,vs2008,vs2012,工作中一直用2012。你试试代码量上去后的编译时间,还有最后一个问题,容器拷贝,可以借鉴COW机制。

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
4 [报告]
发表于 2015-07-05 21:00 |显示全部楼层
回复 26# yulihua49

可以借鉴COM的实现机制,缺点是COM实现不太好理解。
   

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
5 [报告]
发表于 2015-07-18 23:50 |显示全部楼层
本帖最后由 shenlanyouyu 于 2015-07-19 01:17 编辑

最近认真学习了C++11带来的变化,分享给大家。

关于C++标准的更新需要很长的时间,并且也没有达到完美的程度。从03到11,几乎是10年才更新。在这本书中,作者也做出了解释,标准的制订,是许多人和公司的工作才能完成的,需要他们提供建议,互相讨论,并等待他们的实现和测试。没有一个人是full-time为C++标准工作,标准不是一个公司投入大量人员来完成的结果,而是许多人和公司的共同努力达成的结果。

C++ 11 STL带来的变化:
1.取消Template表达式中的空格:
vector<list<int> >; // OK in each C++ version
vector<list<int>>; // OK since C++11

2. nullptr 和std::nullptr_t
C++ 11中使用nullptr来代替0或者NULL,nullptr能够被转换到任何指针类型,但是不能转换到int。以前使用0来表示空指针的,但由于0可以被隐式类型转换为整形,这就会存在一些问题。
3. auto动态类型
在C++ 11中,使用auto可以在声明一个变量或对象时可以不指定数据类型,通知编译器去根据初始化代码推断所声明变量的真实类型例如:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
auto i; // ERROR: can’t dedulce the type of i

4.更强大的for循环

C++ 11提供了功能更强大的for循环,指定循环的范围,数组等,功能更加灵活强大。

for ( decl : coll ) {

statement

}

for ( int i : { 2, 3, 5, 7, 9, 13, 17, 19 } ) {

std::cout << i << std::endl;

}

5.    Rvalue右值引用
我个人认为Rvalue是C++ 11中引入最重要的功能,避免不必要的拷贝和缓存,解决部分以前STL中存在的内存使用率较低的问题。

6.    noexcept

C++ 11提供的keyword noexcept主要用于表明函数不能抛出异常或者准备抛出异常。

7.    constexpr

constexpr确保表达式在编译的时候进行计算,例如

constexpr int square (int x)

{

return x * x;

}

float a[square(9)]; // OK since C++11: a has 81 elements

8.    可变参数的Templates

9.    Lambdas

匿名函数从函数式编程中借来的强大特性,使很多其他特性以及类库得以实现。可以在任何使用函数对象或者函子(functor)或std::function的地方使用lambda。

10.  decltype

decltype 可以让编译器确定表达式的类型,例如:

std::map<std::string,float> coll;

decltype(coll)::value_type elem;

11.  Smart Pointers 智能指针

unique_ptr: 如果内存资源的所有权不需要共享,就应当使用unique_ptr,它没有拷贝构造函数,但是它可以转让给另一个unique_ptr(存在move构造函数)。
shared_ptr: 如果内存资源需要共享,那么使用shared_ptr。
weak_ptr: 持有被shared_ptr所管理对象的引用,但是不会改变引用计数值。它被用来打破依赖循环。
auto_ptr:已经被废弃,不会再使用了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP