
C++
文章平均质量分 54
believe_s
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
宏定义及相关用法
宏定义及相关用法欢迎各位补充目录一些成熟软件中常用的宏定义:使用一些内置宏跟踪调试:宏定义防止使用时错误:宏与函数带副作用的宏参数特殊符号:’#’、’##’1、一般用法2、当宏参数是另一个宏的时候__VA_ARGS__与##__VA_ARGS__一些成熟软件中常用的宏定义:1,防止一个头文件被重复包含#ifndef COMDEF_H#define CO...原创 2019-12-06 16:39:20 · 1593 阅读 · 1 评论 -
无处不在的container_of
无处不在的container_oflinux 内核中定义了一个非常精炼的双向循环链表及它的相关操作。如下所示:struct list_head { struct list_head* next, * prev;};ubuntu 12.04 中这个结构定义在 /usr/src/linux-headers-3.2.0-24-generic/include/linux/types.h 中,...原创 2019-12-06 16:38:15 · 251 阅读 · 0 评论 -
C语言的“编译时多态”
typeof 在 kernel 中的使用 —— C 语言的“编译时多态”C 语言本身没有多态的概念,函数没有重载的概念。然而随着 C 语言编写的软件逐渐庞大,越来越多地需要引入一些其他语言中的特性,来帮助更高效地进行开发,Linux kernel 是一个典型例子。在动态类型的语言里面,往往有 typeof 这种语法,来获取变量的数据类型,比如 JavaScript 当中,typeof 以字符串...原创 2019-12-06 13:44:26 · 519 阅读 · 0 评论 -
基于java的数据结构学习——数组实现的栈以及简单应用C++实现
基于java的数据结构学习——数组实现的栈以及简单应用的 C++ 实现源码: //// Created by PC-Saw on 2019/1/3.//#ifndef DATA_STRUCTURE_ARRAYSTACK_H#define DATA_STRUCTURE_ARRAYSTACK_H#include "Stack.h"#include "MyArray.h"...原创 2019-01-03 16:11:32 · 249 阅读 · 0 评论 -
c++执行vbs脚本
#include<fstream>using namespace std;int main() { fstream out("StartIE.vbs",ios::out); out<<"AppName=\"启动IE\"\n\ Set Wshell=WScript.CreateObject(\"WScript.Shell\")\n\...原创 2018-09-10 11:09:49 · 2477 阅读 · 1 评论 -
protocol buffers使用说明
一、什么是protocol buffersProtocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议,与XML相比,Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次(译注:使用.proto文件定义),便可以使用特别生成的源代码(译注:使用protobuf提供的生成工具)轻松的使用不同的数据流完成...原创 2018-09-05 08:39:34 · 231 阅读 · 0 评论 -
内存问题提醒!结构体+protobuf做协议体发送!序列化
内存的三种分配方式: 1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。 2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。 3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/fre...原创 2018-09-05 08:32:45 · 1844 阅读 · 0 评论 -
C++11多线程----线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行,区别于并发,在一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心...原创 2018-09-04 23:49:03 · 1228 阅读 · 0 评论 -
C++复习
register关键字请求“编译器”将局部变量存储于寄存器中 C语言中无法取得register变量地址在C++中依然支持register关键字 1、C++编译器有自己的优化方式,不使用register也可能做优化 2、C++中可以取得register变量的地址 C++编译器发现程序中需要取re原创 2018-03-14 23:38:45 · 632 阅读 · 0 评论 -
STL之函数适配器
1.理论知识 2.常用函数适配器标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象。常用适配器是:1绑定器(binder):binder通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象。C++标准库提供两种预定义的binder适配器:bind1st和bind2nd,前者把值绑定到二元函数对象的第一个实参上,后者绑定在第二个实参上。2取反器(negator)原创 2017-10-10 19:26:28 · 757 阅读 · 0 评论 -
STL之函数对象和谓词
1.函数对象重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。 这是通过重载类的operator()来实现的。 “在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以使用函数对象或者函原创 2017-10-10 16:00:26 · 668 阅读 · 0 评论 -
STL之容器小结
一、理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;#include "vector"class Teache原创 2017-10-10 15:55:03 · 535 阅读 · 0 评论 -
STL之map和multimap容器
1.简介map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。map可以直接存取key所对应的value,支持[]操作符,如map[原创 2017-10-10 15:49:38 · 631 阅读 · 0 评论 -
STL之set
set简介set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。 set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。 multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而mu原创 2017-10-09 01:20:18 · 594 阅读 · 0 评论 -
C++ 中 new 操作符内幕:new operator、operator new、placement new
一、new 操作符(new operator)人们有时好像喜欢有意使C++语言的术语难以理解。比方说new操作符(new operator)和operator new的差别。当你写这种代码:string *ps = new string("Memory Management");你使用的new是new操作符。这个操作符就象sizeof一样是语言内置的。你不能改变它的含义,它的功能总是一...原创 2018-10-22 17:19:52 · 261 阅读 · 0 评论 -
基于java的数据结构学习——动态数组C++类模板(含拷贝构造,重载常见运算符)
之前实现了java的动态数组,试着写了个C++版的,同样对时间复杂度振荡进行了处理。纯手打,代码如下 ://// Created by PC-Saw on 2018/12/19.//#ifndef DATA_STRUCTURE_MYARRAY_H#define DATA_STRUCTURE_MYARRAY_H#include <iostream>using na...原创 2018-12-20 20:33:24 · 631 阅读 · 0 评论 -
gdb 调试 TuMediaService
gdb 调试 TuMediaServicegithub地址起因首先需要有 armgdb 环境运行 ./armgdb ./TuMediaService 进入 gdb 模式b hi3531_trcod_interface.cc:98 打断点r 运行程序print this->vdec_config_path_ 打印关键值 在这里我们关注的值已经被修改,由于程序中没有刻意对...原创 2019-09-20 14:44:33 · 168 阅读 · 0 评论 -
valgrind检测libevent内存泄露
valgrind检测libevent内存泄露github地址在使用封装好的http库时,遇到了如下的内存泄露,一开始在definitely处还存在泄露,这里就不贴图了,已经被淹没了。 根据提示定位出错代码位置,如下图: 这里提示evhttp_new这里出现了泄露,我们先到http库中解决已经存在的内存泄露,在析构函数里已经对这一块做了处理如下图: 这里有一个注意点,因为这里是...原创 2019-09-09 15:48:52 · 851 阅读 · 0 评论 -
C++没有调用析构函数
github地址在项目中遇到一个问题,析构函数没有调用产生了内存泄露。具体见valgrind检测libevent内存泄露我们看两个例子demo1class Test1;void del(Test1* obj){ delete obj;}class Test1{public: Test1(){ printf("Test1\r\n"); }...原创 2019-09-09 15:44:24 · 2649 阅读 · 0 评论 -
移动语义,右值引用
移动语义目录右值引用变量是左值move库函数移动构造函数和移动赋值移动操作库容器和异常移动赋值操作符移动后的对象必须是可以析构的合成移动操作右值移动左值拷贝右值在无法被移动时进行拷贝拷贝和交换赋值操作与移动移动迭代器右值引用和成员函数右值与左值引用的成员函数重载带引用修饰符的成员函数精确传递 关键术语有一些类的资源是__不可共享__的,这种类型的对象可以被...原创 2019-08-29 17:43:11 · 440 阅读 · 0 评论 -
CMake 常用的预定义变量
CMake 常用的预定义变量PROJECT_NAME : 通过 project() 指定项目名称PROJECT_SOURCE_DIR : 工程的根目录PROJECT_BINARY_DIR : 执行 cmake 命令的目录CMAKE_CURRENT_SOURCE_DIR : 当前 CMakeList.txt 文件所在的目录CMAKE_CURRENT_BINARY_DIR : 编译目录,可使...原创 2019-08-29 17:41:45 · 771 阅读 · 0 评论 -
Protocol Buffer 序列化
Protobuf使用目录proto3的更新定义协议格式编译protobufprotobuf_API枚举和嵌套类标准消息方法解析和序列化写一条消息阅读消息编译Protobuf扩展优化高级用法proto3的更新在第一行非空白非注释行,必须写:syntax = "proto3";字段规则移除了 required,并把 optional 改名为 s...原创 2019-08-29 17:39:22 · 1556 阅读 · 0 评论 -
C++11新特性——移动语义,右值引用
移动语义有一些类的资源是__不可共享__的,这种类型的对象可以被移动但不能被拷贝,如:IO 或 unique_ptr库容器、string 和 shared_ptr 支持拷贝和移动,IO 和 unique_ptr 则只能移动不能拷贝。。右值引用右值引用是必须绑定到右值的引用,右值引用使用 && 符号,相较于左值引用的& 。右值引用有一个特性就是其只能绑定到即将销毁的对...原创 2019-08-20 16:12:08 · 454 阅读 · 0 评论 -
C++ 学习杂谈:sizeof和sizeof(string)的问题
最近遇到一个令我困惑的问题,就是 sizeof(string)的值,之前在vs2010上测得是固定28,最近在用CLion,上面测得是4,出现了不一样的结果,我又在vs2013上试了一下,结果又不一样,在vs2013上是32.查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占...原创 2019-01-29 15:50:37 · 3433 阅读 · 0 评论 -
Thinking in C++遇到的函数指针及应用
//// Created by PC-Saw on 2019/1/24.//#include <iostream>#define TEST 2/* 1. */ typedef int* (*(*fp1)(int))[10]; // 首先是一个函数指针,接受一个int型参数,返回一个指向10个int指针数组的指针/* 2. */ ...原创 2019-01-24 22:23:26 · 131 阅读 · 0 评论 -
leetcode练习——数组篇(1)(std::ios::sync_with_stdio(false);std::cin.tie(nullptr);)
题号1. 两数之和:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 ...原创 2018-12-17 21:30:47 · 390 阅读 · 0 评论 -
STL之deque和其他容器
deque简介deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。 deque在接口上和vector非常相似,在许多操作的地方可以直接替换。 deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。 deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或原创 2017-10-09 01:13:58 · 561 阅读 · 0 评论 -
STL之Vector
1.简介vector是将元素置于一个动态数组中加以管理的容器。可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法,还支持迭代器方式存取)。 vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时2.对象初始化vector采用模板类实现,vector对象的默认构造形式vector<T> vecT; vector<int> vecInt;原创 2017-10-09 01:08:11 · 570 阅读 · 0 评论 -
C++之构造函数和析构函数
一、构造函数1. 构造函数的定义: 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数; 2)构造函数在定义时可以有参数; 3)没有任何返回类型的声明。 2. 构造函数两种调用方式: 自动调用:一般情况下C++编译器会自动调用构造函数 手动调用:在一些情况下则需要手工调用构造函数二、析构函数1. 析构函数的定义: 1)C++中的类可以定义一个特殊的成原创 2017-09-18 15:57:07 · 435 阅读 · 0 评论 -
C++之类
A)封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。 B)封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 备注:有2层含义(把属性和方法进行封装 对属性和方法进行访问控制)C++中类的封装 成员变量,C++中用于表示类属性的变量 成员函数,C++中用原创 2017-09-18 15:36:59 · 396 阅读 · 0 评论 -
const的用法,特别是用在函数后面
原文出处:http://blog.youkuaiyun.com/zcf1002797280/article/details/7816977转载 2017-09-26 15:04:48 · 565 阅读 · 0 评论 -
C++之泛型编程(模板)
标题1.模板综述 背景有时候许多函数或子程序的逻辑结构是一样的,只是要处理的数据类型不一样有时候多个类具有相同逻辑的成员函数和成员变量,只是成员变量的数据类型以及成员函数的参数类型不一样模板就是解决数据类型不一致造成代码冗余的一种机制,本质上就是数据类型参数化,用一种逻辑结构抽象出多种数据类型对应的函数或者类 2.函数模板2.1基础语法示例代码#include <iostream>usi转载 2017-09-26 10:45:32 · 701 阅读 · 0 评论 -
C++之过载函数
过载函数的定义: 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同过载函数的判断标准: 函数重载至少满足下面的一个条件: 参数个数不同 参数类型不同 参数顺序不同 函数返回值不是函数重载的判断标准调用重载函数的准则: 将所有同名函数作为候选者 尝试寻找可行的候选函数: 1 )精确匹配实参原创 2017-09-17 20:59:29 · 2356 阅读 · 2 评论 -
C++之默认参数
一、什么是默认参数C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替二、默认参数规则只有参数列表后面部分的参数才可以提供默认参数值 一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数#include <stdio.h>// 函数的默认参数:当函数调用没有提供该参数的值,会使用默认的值int mul(int原创 2017-09-17 20:55:24 · 723 阅读 · 0 评论 -
C++之内联函数
内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等) 内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求 内联函数由 编译器处理,直接将编译后的函数体插入调用的地方 宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程 注:内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。C++中内联编译的限制: 不能存在任何形式的原创 2017-09-17 20:53:03 · 443 阅读 · 0 评论 -
C++之引用
普通引用和常引用1. 变量名的回顾 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号) 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间 问题:一段连续的内存空间是否只能有一个别名吗?2. C++引用的概念 引用可以看作一个已定义变量的别名 引用的语法:Type& name = var; 注:普通引用在声明时必须用其它的变量进行初始化3. 引用意义原创 2017-09-16 14:18:36 · 261 阅读 · 0 评论 -
C++与C中const的比较以及const和define的比较
C++与C中const的比较:C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间C++编译器对const常量的处理当碰见常量声明时,在符号表中放入常量 ==> 问题:那又如何解释取地址 编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)但是编译过程中若发现使用常量则直接以符号表中的值替换,即使给该常量分配了空间,也并不使原创 2017-09-16 12:00:06 · 336 阅读 · 0 评论 -
C++对C的一些加强和变化
C++对C的一些加强和变化原创 2017-09-16 11:00:05 · 305 阅读 · 0 评论 -
C++之多态
1.问题引出 子类定义了与父类中原型相同的函数会发生什么?父类指针/引用指向父类对象和子类对象#include <iostream>using namespace std;/*基类*/class Parent {public: void func()//基类和派生类函数原型一样 { cout << "i am parent" << endl; }原创 2017-09-24 23:50:49 · 523 阅读 · 0 评论 -
C++之纯虚函数和抽象类
纯虚函数和抽象类1.基本概念 2.案例#include <iostream>using namespace std;////面向抽象类编程(面向一套预先定义好的接口编程)//解耦合 ....模块的划分class Figure //抽象类{public: //阅读一个统一的界面(接口),让子类使用,让子类必须去实现 virtual void getArea() = 0转载 2017-09-26 15:41:10 · 735 阅读 · 0 评论