C++11中有两种声明函数的方式,一种如同C里面继承过来的 return-type identifier ( argument-declarations… ) 另外一种是C++11中新定义的,能够配合decltype配合使用的 auto identifier ( argument-declarations… ) -> return_type 两种定义效果相同,而后者能够方便地使用decltype来推断返回类型,这在泛型编程中十分管用,详见stackoverflow 另外,在C++14中,在函数被调用前能够明确给出定义,并且所有return语句都deduce到相同返回类型,函数还允许这样的简化声明 auto identifier ( argument-declarations… )
Tag: C++
[C++] C++11 decltype关键字
在C++11中,decltype和auto都是关于类型的关键字。auto能够在编译时自动选择变量类型(当然还有其他很多用法,这里主要记录decltype),而decltype则能够推测出变量的类型,这与typeid关键字有点相似,但两者的机制完全不同。 typeid typeid使用的是RTTI(Run-Time Type Identification)机制,由于它是在运行时进行类型确认,会影响运行效率。 decltype decltype关键字则是在编译时便确定变量类型,它有许多有用的用法,例如使用已有变量定义新变量的类型、重用匿名类型、泛型编程中结合auto追踪函数的返回值类型(例子如下)。 template <typename _Tx, typename _Ty> auto multiply(_Tx x, _Ty y)->decltype(_Tx*_Ty) { return x*y; } 详细参考原博客
[C++] emplace_back and push_back
在向容器,如std::vector中添加元素时,常常使用push_back(var),这个时候,往往元素要经过拷贝(copy)或者移动(move)才能放进容器中。 而emplace_back()方法则能够就地构造元素(参数列表与元素某个构造函数的参数列表相同,该方法直接将构造的对象放到容器中,不用经过拷贝或者移动),效率更高。 References https://stackoverflow.com/questions/4303513/push-back-vs-emplace-back https://blog.csdn.net/xiaolewennofollow/article/details/52559364
[C++] 涉及类的关键词
C++11里面有许多关键词,以前稍微学过,但是不多用。这几天看一些代码,重温一下这些关键词。 位于函数声明尾部 如 datatype function_name() keyword; const const关键词表示该函数不修改类成员变量。 overide overide表示该函数覆盖掉父类同签名函数的声明。没有overide关键词时,父类的同名函数被hide,需要使用 using fatherClass::function_name; 才能调用父类声明的函数。 = 0 该关键词与virtual一起使用,指明该函数为纯虚函数,子类必须定义。 = default 在C++11中,为了解决特殊成员函数的问题,例如程序员定义的默认构造函数X::X() {}效率并不如编译器自动生成的默认构造函数,引入了defaulted特殊成员函数。在特殊成员函数后面加上= default后,编译器便会自动生成较高效率的默认构造函数。 C++中类的特殊成员函数有:Default constructor, Copy constructor, Move constructor (C++11), Copy assignment operator, Move assignment operator (C++11), Destructor. = delete 在C++11中,为了解决成员函数禁用的问题,引入了delete关键词。成员函数禁用的情况主要有两种:(1)我们想禁止默认复制构造、默认复制赋值;(2)我们不希望子类调用父类的某些函数。
C++: GCC编译选项-O1, -O2, -O3
GCC中这几个编译选项-O1, -O2, -O3是编译器的优化选项,作为使用者,这里仅了解一下三个编译选项对应的优化内容。详细可以参考回答 -O1 (or -O) 在不影响编译速度的前提下,尽量减少代码大小以及运行速度。 -O2 牺牲部份编译速度,使用所有支持的优化算法以提高运行速度(包括-O1的) -O3 除了-O2中的优化算法,还采用向量化算法,以及其余方法提高并行度以及运行效率(流水线、cache等)。 此外,还有其余许多优化编译选项,可见上面的连接。