c++11
文章平均质量分 94
索疋
NULL
展开
-
【理论实践】#define 和const带给开发者的影响区别
#define STR 1.76333333预编译const double STR = 1.76333333;主要区别:1、处理阶段不同预编译可以简单的理解为替换代码,基本不会出错,靠前。常量定义是合法的变量只是不可修改值,发生在编译和链接阶段2、标识符号处理结果不同预编译处理之后,标识舍弃,编译、链接和运行时绝对不会提示出原名称。常量定义如果编译带符号编译原创 2017-06-29 19:14:14 · 326 阅读 · 0 评论 -
【理论实践】指向类模板函数的指针的使用(以std::list为例)
假设有这个一个场景,我们希望根据条件决定插入元素到list首或尾,条件判断一次,插入操作多次,例如二叉树,至少要处理左和右各一次。普通的代码很简单,每次操作时,都判断一下,简化一下是一个三元表达式。巧妙一点的,可以定义一个变量指定接口函数,根据条件设定指定的值,然后后面就可以直接用函数指针了,不再需要重复判断,实现代码如下: list l; typedef原创 2017-07-29 14:21:52 · 1732 阅读 · 0 评论 -
std::async替代std::thread
std::thread提供了比较简洁的线程操作,如果我们需要获得线程内的结果时,比较麻烦,需要先外部定义一个变量,然后内部赋值,外部join。这个过程代码大致如下:void f1(){ char rst[32]="\0"; thread t([&rst]{ cout << "thread run begin"转载 2017-07-20 19:56:23 · 1130 阅读 · 0 评论 -
【经验分享】3个C++实用技巧
一、柔性数组(长度是0的数组)技巧:定义在结构体最后面,占位,用于访问转换之后对应位置的数据,通用用于流式数据结构化过程。例如:消息结构是16位长度,后跟数据,但数据是不定长的,代码如下:typedef struct{ uint16_t len; char data[0];} msg_head_t;int main(){ uin原创 2017-07-20 21:11:31 · 331 阅读 · 0 评论 -
【g++bug】 vector.erase (const_iterator)调用报错
报错如下:no matching function for call to ‘std::vector::erase(__gnu_cxx::__normal_iterator >&)’ v.erase(e);原因:g++未实现这个接口,但c++11标准定义了这个接口,算编译器bug。g++4.9.0修正。详情: 1、接口定义如下,参见htt原创 2017-07-18 12:47:57 · 1686 阅读 · 0 评论 -
【理论实践】c++11初始化列表使用
1、用于初始化对象,避免定义仅赋值的构造函数。注意,如果定义了任意一个构造函数,将不再合成默认构造函数,需要显示定义。class A{public: int a; int b; int c;};int main(){ A a{1,2,3}; //等价于定义A(int ia, int ib, int ic): a(ia), b(ib), c原创 2017-07-18 12:58:26 · 192 阅读 · 0 评论 -
C++11Lambda捕获列表使用
情况比较多,发现一个比我总结好的,转自http://blog.csdn.net/zh379835552/article/details/19542181摘抄之:捕获值列表,是允许我们在Lambda表达式的函数体中直接使用这些值,捕获值列表能捕获的值是所有在此作用域可以访问的值,包括这个作用域里面的临时变量,类的可访问成员,全局变量。捕获值的方式分两种,一种是按值捕获,一种是按引用捕获。转载 2017-07-18 13:27:15 · 16087 阅读 · 0 评论 -
使用智能指针shared_ptr注意事项
发现一个总结的非常不错的文章,转一下。先补一条自己的补充:一、子类转父类问题前提是基于错误的正常,父类未写virtual析构,子类有虚函数。手动管理时类型明确遮掩了问题,智能指针管理时,是根据传入类型来管理,如果先行转换为了父类,暴露问题。class Base{public: int a = 1;};class B : public Base{publi转载 2017-07-21 17:36:13 · 818 阅读 · 0 评论 -
【理论实践】c++11杂七杂八技术点
一、thread.joinable(),用于判断线程是否在运行,可结束状态。一般用于上一个线程的回收。 文档:http://www.cplusplus.com/reference/thread/thread/joinable/ 示例:if(t.joinable()) t.join();二、lock_guard和unique_lock,前者只是简单的构造获得锁原创 2017-07-18 13:30:10 · 439 阅读 · 0 评论 -
【理论实践】实例体会一下using声明会屏蔽外层作用域的同名实体
理论铺垫:using 声明:明确指定使用哪个作用域下的实体,比如: using std::vector。一次只能引用一个命名空间的一个成员。using 指示:明确指定引用哪个命名空间,比如:using namespace std。相当于引用所有成员。using 声明和指示可以出现在:全局作用域、局部作用域、命名空间作用域,但仅using声明可以出现在类的作用域中(定义类的{}里)。原创 2017-07-24 13:39:08 · 287 阅读 · 0 评论 -
【理论实践】用alignas代替#pragma pack
知识背景: 字段对齐,使对象或成员的地址满足一定要求。4字节对齐就是地址都是4的整数倍,这个必须是2的N次方。 为什么要对齐?一方面,如果4字节对齐了,对于128个内存空间,实际只有32个独立地址,相当于管理地址变少了,文件系统经常这么用,用少的寻址空间,管理更大的磁盘空间。另一方面,一些硬件设计上了,为了一些考虑,强制要求地址要符合指定规则。 对齐原创 2017-08-17 15:43:18 · 2788 阅读 · 0 评论 -
【理论实践】new的三种用法:plain new,nothrow new和placement new
一、plain new就是最普通的new的,动态创建一个对象或数组,基本用法如下:class A{ int m_v;public: A() {} A(int v) : m_v(v) {} A(double v) : m_v(ceil(v)) {}}; A* p1 = new A; /原创 2017-08-17 18:01:45 · 852 阅读 · 0 评论 -
【理论实践】快速认识allocator,并不神奇但吓退一片的内存管理机制:内存分配和对象构造分离
从面试来看,很少人掌握allocator,似乎是很难的东西,但其实不是,我个人总结原因以下几点: 1、如果不是运行环境特殊,没有个性化实现的必要,默认即可,所以根本没有给别人实践的机会。 2、标准接口定义偏多,显得复杂。 3、很多c++研发都是通过读《c++ primer》加深c++的,这本书,对这块只是简单略过。我用我自己话,带你简单的原创 2017-08-17 18:43:19 · 575 阅读 · 0 评论 -
【理论实践】size_t和std:size_t可能是不同的类型定义,只是定义为相同的类型
这个很少被人意识到,2个分别对应到c头文件定义和c++头文件定义,日常使用没有影响是因为先包含的会使后续包含定义触发条件编译,而且经常using namespace std;使不区分std:size_t。做为一个优秀的代码输出者,要严谨的弄清楚,有针对性的处理,提高代码质量,降低代码开发周期。结论:c和C++混编,尤其是跨平台时,一定要注意头文件包含顺序,如果是c++,最早的包含c++原创 2017-06-28 10:39:00 · 2689 阅读 · 0 评论 -
举例说明c++对象内存空间计算(虚函数表,虚继承)
概念普及:1、虚函数表,相当于函数地址数组,编译阶段,使用数组中的值做为函数地址,运行时,具体的对象有具体的地址,以此来实现"函数覆盖,不是重载“。2、虚基类表,相当于偏移量数组,虚继承时,对于虚基类,只会分配一次空间,具体需要的对象上,通过虚基类表获得具体对象成员的偏移。编译器优化会导致同时需要虚函数表的和虚基类表的合并为一处,所以下文统称虚表。核心总结2点就可以了:原创 2017-06-26 13:45:42 · 585 阅读 · 0 评论 -
基于c++11泛型编程开发一个LeetCode本地开发测试组件
LeetCode初次接触感觉还不错,重点是可以对比讨论共同实现的一段代码,https://leetcode.com。处理复杂问题不适合在OJ上直接开发,本地调试更简单。暂时(我想应该会有)未发现可以直接拿来运行的框架,自己简单实现一个,未来发现更好的再补充。注意:只以用c++11,g++编译选项-std=c++11一个需要两个文件leetcode.h 包含一些流程控制和通用api(原创 2017-06-29 17:21:23 · 686 阅读 · 0 评论 -
【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码
很遗憾,原始代码未仔细整理,只留有分享给别人的截图,来源于学习c11时的构想陷阱点:1、lamda[i]传值是只读复制,不能改,++无效,要用i+12、如果加了mutable之后,是可以改了,但改的是副本3、如果用了引用,lamda内部会改这个值,而且lamda调用是回调,可能有非顺序的时序(多线程环境)或者复杂的流程顺序,使分析不清楚i的值建议:lamda捕获原创 2017-06-29 19:48:10 · 435 阅读 · 0 评论 -
shared_ptr模拟代码
#include //#include #include using namespace std;templateclass shared_ptr{ T* m_ptr = NULL; int* m_inf = NULL; shared_ptr(){}public: shared_ptr(T* ptr) {原创 2017-06-24 00:40:16 · 230 阅读 · 0 评论 -
【旧资料整理】c++ 定义矩阵类CMatrix,重载二维数组运算符[][]方法
资料时间:2009-12-02之前分享时间:2009-12-02到百度空间,空间关闭,重新整理内容:实现一个二维(多维同理)数组类,对下标做安全处理,避免内在越界,行列分别保留一个冗余位置以确保任何时候可以返回合法地址原代码因为最早分享的论坛关闭找不到了,重新实现一个如下:#include using namespace std;class Row{原创 2017-06-24 11:32:25 · 3325 阅读 · 0 评论 -
【旧资料整理】c++ 虚基类开销衡量
资料时间:2009-12-02之前分享时间:2009-12-02到百度空间,空间关闭,重新整理定义四个类class B{};class M1:public B{};class M2:public B{};class H :public M1,public M2{};则继承关系为H/\M1 M2| |B原创 2017-06-24 11:51:35 · 360 阅读 · 0 评论 -
【旧资料整理】C++ 关于读入文件出错
资料时间:2009-12-02之前分享时间:2009-12-02到百度空间,空间关闭,重新整理经常从文件读入数据,如果读入失败,应该停止处理,否则会产生无法预期的错误f。文件流stream出错常见这样三种情况。一、文件不存在:如果用了ios::in打开方式,不创建文件,file值是0,file>>变量返回0,file.eof返回0,不产生异常。所以try{}catch(){原创 2017-06-24 12:16:33 · 1415 阅读 · 0 评论 -
对比理解一下STL的自定义比较方法
STL模板定义比较操作的方法不止一种,之前见过别人用时总是变换方式直到编译不出错为止,STL的错误提示非常长和复杂,不理解透彻将是耗时的。实际上STL的模板提供了2种完全独立的方法,一种是使用前者相当于扩展对象,通过重载两者情况混淆才是造成前面所提以试验为导致的解决方法混乱的原因。以sort函数调用为例进行讲解,后文全部给出完整可运行代码以避免自行编译有错误影响分析。原创 2017-07-04 20:52:29 · 530 阅读 · 0 评论 -
类模板函数使用时实例化说明
这个规则的一个有意思的结果就是:如果传递的类型仅使唤部分类成员函数合法,只要调用不到,不影响类模板使用。以下代码是个展示例子templateclass Tpl{public: void fun1(_T o) { char data[o]; cout << sizeof(data) << endl; } void fu原创 2017-06-26 15:48:42 · 897 阅读 · 0 评论 -
constexpr说明以及g++4.8.2实测分析
数组定义必须是常量或与常量等价(不随着运行状态变化而发生值变化,在编译阶段就能确定的c++11增加了constexpr来对函数声明为返回常量,可以用于定义数组,但是实测结果如下,应该是g++编译器扩展吧,而且除constexpr外不加g++11编译选项也可以通过。constexpr int f_size(int i) { return i + 10; }int f_size2(int原创 2017-06-26 15:49:40 · 361 阅读 · 0 评论 -
用实例代码理解一下c++11”定义析构函数阻止合成移动”
先普及一下基本知识:1、移动:int &&a = b; 将b移动给a,会避免一些对象复制,移动之后,b就没有用了。2、析构:对象释放时,执行的清理函数。原理很好理解:如果定义了析构函数,则说明清理工作有一些个性化,成员数据如果执行了移动 ,会产生扫尾时,数据已经无效了或继续有效,但操作会影响其他对象。这个时间,会执行拷贝代替移动 。通过以下代码的差异化,可以感受一下:1、F2原创 2017-06-26 15:50:48 · 1646 阅读 · 0 评论 -
【c++11 新特性应用】利用bind实现通用的混合任务线程池
先简单认识一下std::bind,详细资料查阅相关资料,这里不啰嗦,假设你已经具备了理论知识:auto f1 = bind(&fun_int, 3,std::placeholders::_1);这名话的意思是给fun_int绑定2个参数,第一个是3,第二个本来的第1个参数,返回一个函数对象,这样调用f1(5) 等价于调用fun_int(3,5)这样,bind就可以将任意函数的任意具体调原创 2017-07-05 22:51:41 · 1017 阅读 · 0 评论 -
整理并解释一些c++编译和运行错误
一、error: passing ‘const 类名' as ‘this’ argument of ‘bool 类名::函数名 (const XXX&)’ 字面翻译就可以大体知道原因,const XXX无法传递给this,类成员函数有一个隐藏参数,就是this,原因很明显了,const到非const转换。那怎么把this const了呢? 声明const成员函数原创 2017-07-04 21:48:47 · 1351 阅读 · 1 评论 -
【C++11】thread_local/TLS/线程本地存储
c++11关键字,简单理解就是thread_local int a,不同的线程读到不的a是不同的存储空间,避免了全局变量冲突,时间关系,简单贴一下别人的总结http://blog.csdn.net/u013390476/article/details/52129607c++之前,有编译器修饰符或api支持等价实现,没有深入研究,具体参考TLS相关的资料,这里给出其一。http:转载 2017-10-21 00:11:29 · 3214 阅读 · 0 评论