
C++学习
werweqg
每天进步一点点。
展开
-
C++引用调用 指针传递
C++引用调用 指针传递引用调用操作地址是实参地址,相当于实参的一个**别名**,因而对其操作即对实参的操作引用规则(1)引用创建同时需被初始化。(2)不能有NULL引用。(3)一旦引用被初始化,即不可改变引用的关系常量引用调用如下为常量引用int findMax(const vector<int> & array);常量引用保证: - 省去副本开销 - 函数调用不会改变实参指针传递原创 2015-03-01 01:16:23 · 728 阅读 · 0 评论 -
[c++ 笔记]shared_ptr 理解创建时即捕获析构动作
1. shared_ptrshared_ptr 是c++ 管理资源的利器,也是C++ 相对于其他语言最大区别的RAII特性的最直观体现。shared_ptr一大好处是其创建时即捕获析构动作,即使基类析构函数不是虚函数,也能正确完成子类与析类的析构动作。如下:class Base{public: ~Base() { std::cout &lt;&lt; "B...原创 2018-11-19 11:21:39 · 1869 阅读 · 2 评论 -
[effective modern c++ 学习笔记] Lambda 表达式 彻底抛弃bind
要点总结&lt;1&gt; lambda基本形式[捕获列表](形参表){函数体}std::find_if(container.begin(), container.end(),[](int val) { return 0 &lt; val &amp;&amp; val &lt; 10; })&lt;2&gt;默认捕获方式的陷阱 (1)引用方式 捕获原创 2018-10-30 11:27:47 · 318 阅读 · 0 评论 -
C++学习笔记 引用折叠与完美转发
完美转发仅仅发生于当调用该函数时会发生类型推倒如template&lt;typename T&gt;void test(T&amp;&amp;a){} 如下情况CallService并不会发生完美转发template&lt;typename R,typename ...Paras&gt;class ServiceClient{ ReturnType&a原创 2018-09-18 20:26:30 · 375 阅读 · 0 评论 -
C++学习笔记 右值引用 移动语义
##移动语义C++以往的按值返回等情况需要构造临时对象,并调用复制构造函数。然而如果将临时对象的所有权直接交给最终的对象,则可以省去中间的这一步临时对象构造、复制构造、销毁临时对象的过程。即移动对象,这就是移动语义。由以上所致,移动对象的作用者应该是即将消失的临时对象,那么如果知道哪些对象是临时对象,C++标准值认为右值是安全的移动对象。右值对象根本上可以认为是无名对象。##右值引用为...原创 2018-09-18 00:26:31 · 158 阅读 · 0 评论 -
进程单例模式
1.问题不同于线程单例模式,很多时候我们希望一个程序只有一个实例在运行。 常规的做法有创建一个命名文件,通过判断这个文件存在不存在来确定是否已经有进程实例启动 更进一步,可以通过对文件加锁的方式,从而避免前面方法中需要在程序退出时删除文件的操作,但是文件加锁 需要文件系统的支持。fat32等文件系统不一定支持该操作2.socket方式可以利用socket端口作为锁,而且程序退出后...原创 2018-09-11 11:56:21 · 1853 阅读 · 0 评论 -
_cdecl与_stdcall区别
一、概念(1)_stdcall调用_stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,由调用者完成压栈操作,被调函数自身在返回前清空堆栈。 WIN32 Api都采用_stdcall调用方式。对于如下函数:/* 1. calling function in C++ */i = Function(x, y, z);/* 2. function body in C++原创 2015-04-04 22:16:07 · 448 阅读 · 0 评论 -
c++内存池
总体思想:首先申请一大块内存,在将其分割为一个个小的单元,每一个单元的起始位置放置着用于管理内存块的双向链表结点。剩余位置放置用户数据。#include<iostream>#include<Windows.h>class CMemPool{private: struct _Unit { _Unit*pPre; _Unit*pNext; }原创 2015-04-05 20:38:39 · 429 阅读 · 0 评论 -
理解复杂的c变量声明
1.前言 对于一些复杂的c语言变量声明,往往难以理解。 简单的,如:int foo[5] ; //foo is an array of 5 intschar *foo; //foo is a pointer to chardouble foo(); //foo is a function returning double非常容易理解。稍微复杂的声明:char *p[5] ;//p is原创 2015-04-04 12:25:41 · 617 阅读 · 0 评论 -
临界区,互斥量,信号量,事件的区别
四种进程或线程同步互斥的控制方法 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section)保证在某一时刻只有一个线程能访问数据的简便转载 2015-03-30 17:31:58 · 328 阅读 · 0 评论 -
lambda表达式
lambda表达式是c++11引入的新特性,用于创建匿名的函数对象各部分含义Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。该部分不能省略Lambda表达式的参数列表Mutable 标识,一般可省略原创 2015-03-20 13:22:27 · 406 阅读 · 0 评论 -
c++学习--模板--实现my_vector
主要练习模板的使用 代码如下:#ifndef _MY_VECTOR_H_#define _MY_VECTOR_H_template<class T>class my_vector{public: explicit my_vector(int initSize = 0) :m_size(initSize), m_capacity(initSize) { p_a原创 2015-03-03 00:26:20 · 991 阅读 · 0 评论 -
offsetof与container_of宏
转载出处:https://www.cnblogs.com/Anker/p/3472271.html 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中...转载 2019-05-06 10:55:25 · 115 阅读 · 0 评论