![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++技术
swordmanwk
这个作者很懒,什么都没留下…
展开
-
现代C++技术研究(8)---完美转发
这个其实也就是std::forward和std::move的区别,std::move一律强转为右值引用,而std::forward只是转发,把右值或右值引用强转为右值引用,把左值和左值引用强转为左值引用。3)在模板函数中,通过Universal Reference的隐式类型推导得到的右值引用,编译器不会触发移动构造,必须要通过std::move或者std::forward或者static_cast显示类型转换为右值引用,编译器才会触发移动构造。《深入理解C++11》原创 2023-06-03 18:37:23 · 606 阅读 · 0 评论 -
现代C++技术研究(7)---std::move的使用场景
使用std::move就是为了把入参强转为右值,通常这样做是为了触发移动构造函数的调用,大部分场景都是OK的,但是,如果入参是常量,不要加std::move,因为加了也不会调用移动构造函数;如果入参是临时对象,也不要加std::move,因为不加也会调用移动构造函数。这个也容易理解,移动构造函数可能会修改入参,因为定义为常量,不能修改,所以不能调用移动构造函数,但是拷贝构造函数的入参是可以接受常量的。支持移动语义,是现代C++的主要语言特性之一,std::move本质上就是把一个变量强转成右值引用。原创 2023-05-21 21:08:43 · 1100 阅读 · 0 评论 -
现代C++技术研究(6)---编译器自动生成移动构造函数的条件
一般来说,编译器会自动生成的移动构造函数,足够满足我们的使用需求,但是有些场景编译器不会自动生成移动构造函数,这会影响我们编写代码的性能。总结一下:当用户自定义移动构造函数,或移动赋值运算符,或拷贝构造函数,或拷贝赋值运算符,或析构函数时,编译器不会自动生成移动构造函数和移动赋值运算符,这时,只要通过default方式定义默认的移动构造函数和移动赋值运算符,编译器就会自动生成默认的移动构造函数和移动赋值运算符,就可以解决这个问题了。可以看到,编译器实际生成的是拷贝构造函数,没有生成移动构造函数。原创 2023-05-19 22:55:24 · 900 阅读 · 0 评论 -
现代C++技术研究(5)---什么是通用引用(Universal Reference)
通用引用(Universal Reference)是Scott Meyers首先提出的名词,实际上就是指编译时需要进行类型推导的右值引用形式的表达式,现在,很多人认为,更加标准的名称应该叫转发引用(Forwarding Reference)。C++ 98没有右值引用,右值引用是C++11引入的新特性。在C++98中,常量左值引用,可以绑定左值或右值,到C++11也依然如此,因此,把常量左值引用叫做通用引用貌似更合适一些。那么,如何区分通用引用和右值引用呢。3)可以绑定左值(右值引用是不能绑定左值的)原创 2023-04-15 21:08:29 · 399 阅读 · 0 评论 -
现代C++技术研究(4)---引用折叠规则
可以看出,对于TR的类型定义或者ResultType的类型定义,只要出现左值引用,那么类型推导结果一定是左值引用,在没有左值引用的情况下,如果出现右值引用,那么类型推导结果会是右值引用。C++11对类型推导遵守所谓引用折叠规则(reference collapsing)。《深入理解C++11:C++11新特性解析与应用》原创 2023-04-15 08:49:24 · 108 阅读 · 0 评论 -
现代C++技术研究(3)---模板类型推导(3)
本文讨论模板函数的输入参数是数组的场景。如果,把T(&)[N]改成T(&&)[N],编译会失败,原因是这个不是通用引用,而是右值引用。可以看到,推导的结果,T是数组,而ParamType是数组的引用。传入的数组是左值,因此T和ParamType相同,都是数组的引用。这种情况,T和ParamType相同,但退化为指针。原创 2023-04-09 21:03:31 · 57 阅读 · 0 评论 -
现代C++技术研究(2)---模板类型推导(2)
1)当ParamType是一个通用引用时,传入左值参数,模板的类型推导ParamType结果是左值引用,且ParamType和T相同,传入右值参数,模板的类型推导ParamType结果是右值引用,但ParamType和T是不同的,T去掉引用。可以看到,推导出的类型,T和ParamType是相同的,并且后面的const被去掉了,注意,前面的const属性是不能去掉的。可以看到,对于左值,T和ParamType类型相同,对于右值,T去引用,而ParamType是右值引用。原创 2023-04-09 09:21:19 · 408 阅读 · 0 评论 -
现代C++技术研究(1)---模板类型推导(1)
第一种情况:ParamType是引用或者指针,但不是通用引用(Universal Reference)。小结:对于ParamType是引用或者指针,但不是通用引用的场景,模板参数T会去掉引用或者指针。代码中通过std::is_same模板函数来验证T和ParamType的类型推导结果。对于指针,与引用的情况类似。原创 2023-04-08 22:49:19 · 59 阅读 · 0 评论 -
用stringstream进行格式化输出
用C++的方式也可以进行格式化输出,下面一段代码使用stringstream进行格式化输出,供参考。 #include #include int main(){ std::stringstream ss_time; int year = 2012; int month = 1; int day = 30; int原创 2012-01-30 20:42:24 · 12349 阅读 · 0 评论 -
小心stringstream使用时的一个陷阱
前几天在调试程序时发现一个bug,和对stringstream的不当使用有关,代码如下:char number = 0;std::stringstream str_number;str_number .....这段代码的目标是把一个8位整数转换成一个字符串,但原创 2011-10-16 09:56:35 · 1643 阅读 · 0 评论 -
STLSoft的scoped_handle学习心得
<br />scoped_handle是个智能指针类,它通过一个调用者指定的函数,保证作用域内资源的清理。这个资源不可以是C++方式分配的资源(不能是使用new分配的内存,但可以是c方式分配的内存,所以叫scoped_handle)。<br />scoped_handle有三个参数,第一个参数是资源句柄或者指向内存的指针,第二个参数是释放资源时使用的方法,第三个参数用于判断句柄是否有效,其值是句柄无效的值,默认为0。在scoped_handle模板类的析构函数中,会检查句柄是否有效,如果有效,会调用释放资源原创 2011-04-14 19:52:00 · 1734 阅读 · 0 评论 -
《ACE程序员指南》的源代码来源
今天发现《ACE程序员指南》中的源代码可以在ACE的源代码包中找到,具体目录是ACE_wrappers/examples。这样学习《ACE程序员指南》就不用手工一行一行敲入源码了。原创 2011-01-30 10:26:00 · 2797 阅读 · 1 评论 -
auto_ptr的release的含义
<br />我一直以为auto_ptr的release函数会调用delete操作符删除<br /> <br />其所包含的指针,今天才搞清楚,release函数只是简单的释放其对指针的拥有权。原创 2011-01-30 14:31:00 · 5356 阅读 · 0 评论 -
ACE中的条件变量学习心得
<br />ACE的线程同步的方法之一是使用条件变量,我原来对条件变量不大理解,主要原因是Windows<br /> <br />操作系统下并没有直接与之对应的内核对象,而且条件变量需要和Mutex共同使用,<br /> <br />这个让人一下子摸不着头脑。经过反复测试,又查看了ACE的源代码,<br /> <br />我终于理解条件变量为什么总是与Mutex混合使用了。<br /> <br />像以下这段示例代码:<br /> <br />int<br />HA_CommandHandler::svc原创 2011-02-09 17:21:00 · 1664 阅读 · 2 评论 -
《ACE程序员指南》中领导者与跟随者模式示例代码中的bug和解决方案
《ACE程序员指南》中线程池一章中提到了两个模式:一个是半同步半异步模式和领导者和跟随者模式,对于后者书中给出了一个示例程序,为了方便说明,我把示例代码贴在这里:#include "ace/config-lite.h"#if defined (ACE_HAS_THREADS)#include "ace/OS_NS_string.h"#include "ace/OS_NS_sys_time.h"#include "ace/Task.h"#include "ace/Containers.h"#include "原创 2011-02-08 12:42:00 · 2916 阅读 · 0 评论 -
类的private继承,protected继承和public继承的区别
<br />考虑从基类B派生出的类D:<br /> <br />——如果B是private基类,那么它的public和protected成员只能由D的成员函数和友元访问。<br /> 只有D的成员和友元能将D*转换成B*。<br /> <br />——如果B是protected基类,那么它的public和protected成员只能由D的成员函数和友元,<br /> 以及由D的派生出的子类的成员函数和友元访问。只有D的成员<br /> 函数和友元以及由D派生出的子类的成员函数和友原创 2011-03-05 11:28:00 · 990 阅读 · 0 评论 -
ACE_Timer_Queue学习心得
<br />今天学习ACE的定时器,有个地方开始怎么都不理解,现在终于搞清楚了,<br /> <br />现在总结一下:<br /> <br />1)ACE_Timer_Queue的gettimeofday函数,返回的是一个绝对时间值,它可以是当前的绝对时间,也可以不是。<br /> <br />2) ACE_Timer_Queue的calculate_timeout ( ACE_Time_Value * max ) 函数,这个函数把定时器的超时时间和max值做<br /> <br />比较,如果原创 2011-02-17 19:45:00 · 1788 阅读 · 0 评论 -
小心ACE_OS::fopen的一个陷阱
<br />今天用ACE_OS::fopen函数遇到一个很隐蔽的问题,我用ACE读一个二进制文件,<br />然后把内容写到另外一个文件中,和原来的内容不一样了,0A前面加了个0D。<br />后来研究了ACE的源代码,才把这个问题搞清楚,ACE_OS::fopen实际上封装的是<br />c函数库的fopen函数,我写二进制文件,调用函数的代码如下:<br />ACE_OS::fopen(sFileName.c_str(),"at+");<br />t表示文本格式的文件,a+表示<br />Opens f原创 2011-03-28 19:02:00 · 3051 阅读 · 0 评论 -
policy和trait的差别
<br />policy和trait都是在模板库设计时的常用技术,根据牛津字典:<br />trait:用来刻画一个事物的特性。<br />policy:为了某种有益或有利的目的而采取的一系列动作。<br />按照《Modern C++ Design》,policy着重于行为,而trait更关注于类型。<br />下面分别介绍。<br /> <br /> 1trait简介<br />trait技术是一种古老的编程技术,该技术主要用于模板库的设计。实际上,trait技术是设计STL的基础。<br />引入tr原创 2011-05-22 13:31:00 · 1229 阅读 · 0 评论 -
Singleton设计模式——《现代C++设计——泛型编程与设计模式》学习笔记
1.1 Singleton(单实例)如果我们觉得一个类只需要产生一个实例,我们就把它设计为Singleton(单实例模式)。Singleton是在我们项目中使用频率最高的一个模式,该模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 Singleton是一种经过改进的全局变量,该模式的描述很简单,但实现却很复杂。特别是Singleton对象的生命周期管理是实现Singleton时最伤脑筋的地方。 本文将讨论以下几个主题:l 与单纯的全局对象相比,Singleton的特性l 用原创 2011-01-13 21:34:00 · 1989 阅读 · 0 评论