C++
Lailikes
这个作者很懒,什么都没留下…
展开
-
使用watch来监控内存
众所周知,在所有的逻辑Bug中,野指针或者数组越界引起的Bug最难调,因为暴露问题的地方与真正产生问题的地方往往不是在同一个地方,而且这种Bug往往具有随机性,让人头痛。调上述Bug的标准做法就是使用GDB的watch命令来监控内存变化,当watch的内存发生变化时,调试程序会停住,我们就知道是哪一步动了“奶酪”。watch的使用也很简单,如果有一个指针pTest指向一块内存,则:wa...原创 2020-04-20 11:14:28 · 3271 阅读 · 0 评论 -
编译器优化级别O3引入的bug
今天遇到一个问题,写了一个内存管理器,预先分配大量的内存,然后用到的时候从分配器中分配,避免多次new的开销。但这不是重点,重点是写出来之后没有问题,但是O3编译就有问题,捣鼓一阵之后返现O1和O2也没有问题,这明显是O3优化做了不该做的事,但是怎么解决呢?解决方案如下:#pragma GCC push_options#pragma GCC optimize ("O2")// cod...原创 2020-04-18 17:43:18 · 1302 阅读 · 0 评论 -
深入解析new、operator new、::new、placement new
1. new分为两步a、内存分配 调用相应的operator new( )分配内存 b、构造函数 调用相应的构造函数 实验代码:1. class T{ 2. public: 3. T(){ 4. cout << "构造函数。" <<原创 2018-08-02 10:10:56 · 13319 阅读 · 5 评论 -
匿名联合union{...}
匿名联合体是不同时定义任何变量(包含联合体类型的对象、引用或指向联合体的指针)的无名联合体定义。 union { member-specification } ; 匿名联合体有更多限制:它们不能有成员函数,不能有静态数据成员,且所有数据成员必须为公开。允许的声明仅有非静态数据成员和static_assert 声明 (C++14 起)。匿名联合体的成员被...原创 2018-08-02 19:13:56 · 3973 阅读 · 2 评论 -
打屏信息的效率以及处理
实验设计:代码:test.cpp#include <iostream>#include <ctime>#include <cstdio>using namespace std;int main(){time_t start=time(NULL);for(int i=0;i<99999999;i++)printf...原创 2018-09-10 14:20:08 · 115 阅读 · 0 评论 -
C++ 模板类型萃取技术 traits
当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时),traits会是一种很好的解决方案。(类型测试发生在编译期)自从C++中引入了template后,以泛型技术为中心的设计得到了长足的进步。STL就是这个阶段杰出的产物。STL的目标就是要把数据和算法分开,分别对其进行设计,之后通过一种名为iterator...转载 2018-10-11 09:39:35 · 674 阅读 · 0 评论 -
没有参数的函数模板
一般而言,函数模版需要通过参数进行类型推断。没有参数的函数模板必须通过显示实例化来使用。使用场景:any类型的get函数示例:#include<iostream>template <typename T>T fun();template<>int fun(){ return 9;}template<>double...原创 2018-10-12 11:31:55 · 3475 阅读 · 0 评论 -
glog快速上手
1、安装git clone https://github.com/google/glogcd glogautogen.sh./configuremake -jmake install2、使用代码 #include <glog/logging.h> int main(int argc, char* argv[]) { // ...原创 2018-10-12 15:16:52 · 184 阅读 · 0 评论 -
C++写文件
1、头文件#include<fstream>2、fstream对象fstream out("./output.out");//没有文件返回out==0,不会创建文件out<<"hello world"<<endl; 要想fstream对象在没有文件时自动创建对象:fstream out("output.out",ofstream..原创 2018-10-18 14:57:49 · 375 阅读 · 0 评论 -
c++ 两个set合并
C++17提供set和unordered_set的merge,但是C++11并不提供,但依然有简便的方法实现两个set的合并(求并集),如下:set<int> a,b;//合并到aa.insert(b.begin(),b.end());...原创 2018-10-10 10:50:09 · 17061 阅读 · 2 评论 -
C语言位域
http://blog.sina.com.cn/s/blog_3d8529400100istl.html有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区...转载 2018-10-25 19:02:31 · 305 阅读 · 0 评论 -
端口复用SO_REUSEADDR
版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处! https://blog.csdn.net/tennysonsky/article/details/44062173在《绑定( bind )端口需要注意的问题》提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 )。实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用...转载 2018-10-23 11:39:32 · 7103 阅读 · 7 评论 -
C++创建类对象时(无参)后不加括号与加括号的区别
https://blog.csdn.net/Windgs_YF/article/details/80927058https://blog.csdn.net/u012750259/article/details/448327691、在栈中实例化对象A a;//实例化对象,会调用class A中的构造函数A a();//声明一个函数,没有传入的参数,返回值为A类型2、在堆中实例化对...原创 2018-10-23 22:25:57 · 1399 阅读 · 0 评论 -
c++获取类型变量的最小/最大值
#include <limits>int min = std::numeric_limits<int>::min();//模板推断,若是char直接改为char即可int max = std::numeric_limits<int>::max();原创 2018-10-26 11:00:46 · 3610 阅读 · 0 评论 -
C++11 move的实现
template <class T>typename remove_reference<T>::type&& move(T&& t) //通过trait技法推断出返回值。参数类型是T&&万能引用,所以move不仅可以把左值转成右值,也可以把右值转成右值{ using RRefType = typename rem...原创 2018-10-29 15:46:36 · 966 阅读 · 0 评论 -
C++11make_pair问题
https://stackoverflow.com/questions/32443181/stdmake-pair-with-c-11在C++11中使用make_pair一定不要显式给出类型参数,不然会报错#include <utility>using namespace std;int main(){ int n=0,m=0; auto x=make_pair...原创 2018-10-26 14:17:38 · 3966 阅读 · 0 评论 -
C++编程规范(google)
原创 2018-10-24 19:22:04 · 479 阅读 · 0 评论 -
C++中int与string的相互转换
一、int转string1.c++11标准增加了全局函数std::to_string:string to_string (int val);string to_string (long val);string to_string (long long val);string to_string (unsigned val);string to_string (unsigned l...转载 2018-10-30 14:55:47 · 341 阅读 · 0 评论 -
C++不允许使用不完整型别说明
https://blog.csdn.net/qq_36038987/article/details/77747507?locationNum=5&fps=1在讲述柔性数组成员之前,首先要介绍一下不完整类型(incomplete type)。不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象。incomplete types (types that describ...转载 2018-11-01 11:48:29 · 5945 阅读 · 0 评论 -
C++中的RVO优化和NRVO优化
RVO (return value optimization) 和NRVO (named return value optimization) 是C++在处理一个函数返回类对象并将返回值赋给另一个对象时,为了减少拷贝构造次数以及析构次数而采用的一种编译器优化技术。 本篇博客以《深度探索C++对象模型》中例子来总结这两种优化技术。代码片段如下:class Point3d{public:...转载 2018-11-01 16:02:28 · 1469 阅读 · 0 评论 -
C++11中的原子操作(atomic operation)
所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇编语言,或者是借助第三方的线程...原创 2018-11-06 14:50:56 · 252 阅读 · 0 评论 -
无锁队列
理论基础是CAS(Compare And Swap),本质上需要硬件支持,C++11中有相应的接口https://www.cnblogs.com/alantu2018/p/8469168.htmlhttps://coolshell.cn/articles/8239.html转载 2018-11-06 15:34:35 · 187 阅读 · 0 评论 -
LevelDB
https://blog.csdn.net/qq_26499321/article/details/78063856转载 2018-11-09 12:02:38 · 120 阅读 · 0 评论 -
使用OpenMP进行并行编程
OpenMP 入门教程 https://www.cnblogs.com/ospider/p/5265975.html在C++中使用openmp进行多线程编程 https://blog.csdn.net/acaiwlj/article/details/49818965OpenMP中的同步和互斥 https://blog.csdn.net/dcrmg/article/details/...转载 2018-11-05 11:40:09 · 2106 阅读 · 0 评论 -
c++11多线程:std::future , std::promise和线程的返回值
https://blog.csdn.net/lijinqi1987/article/details/78507623std::future对象可以和asych,std::packaged_task,std::promise一起使用。这篇文章集中讨论std::future和std::promise。我们经常会遇到需要得到线程返回结果的情况,现在的问题是我们如何实现。举个例子:假设在程序中,...转载 2018-11-05 19:14:26 · 509 阅读 · 0 评论 -
shared_ptr总结
1、基本使用shared_ptr<A> p=make_shared<A>(); 上述方法可以满足大多数需求,同时也是最好、最安全的shared_ptr使用方式。2、返回share_ptr形式的this指针class A : public enable_shared_from_this<A>{ public: sha...原创 2018-11-29 10:30:59 · 561 阅读 · 0 评论 -
C++异常和以RAII方式封装锁
在多线程编程中,我们应该使用“获得资源时即初始化”RAII(resource acquisition is initialization)。简单说来就是在构造函数中统一分配资源,在析构函数中统一回收资源。{ Lock<vector<int>> lock(v); ...}这种方式有诸多好处,除了使代码更加简洁之外,也是异常安全的。C++保证,如...原创 2018-12-05 11:17:29 · 587 阅读 · 0 评论 -
C++ - 类模板(class template)友元(friend) 的 全部六种形式 及代码
#include <iostream>#include <string> template <typename T> class Pal; //pal朋友,这里模板类的前置声明 class C { friend class Pal<C>; //"以类C实例化"的Pal类, 为C的友元 template <typename T&g...转载 2018-12-05 17:36:48 · 1102 阅读 · 0 评论 -
LLVM与C++代码的相互调用(全注释)
一、在C++中调用LLVM编写的IR函数#include "llvm/IR/LLVMContext.h"#include "llvm/IR/Module.h"#include "llvm/IR/Function.h"#include "llvm/IR/BasicBlock.h"#include "llvm/IR/IRBuilder.h"#include "llvm/Executio.原创 2018-12-12 19:08:40 · 4169 阅读 · 5 评论 -
CMakeLists.txt基本通用模板
cmake_minimum_required(VERSION 3.9)project(LevealDBTry)#设定编译参数set(CMAKE_CXX_STANDARD 11)set(CMAKE_BUILD_TYPE "Debug")#设定源码列表.cppset(SOURCE_FILES ./main.cc)#设定所有源码列表 :aux_source_directory(&l...原创 2018-12-03 17:29:10 · 7504 阅读 · 0 评论 -
error: expected unqualified-id before ‘dynamic_cast’
错误代码:Deride * q= std::dynamic_cast<Deride*>(p);其实很简单,但没有想到又会卡半天,dynamic_cast并不是std库中的部件,而是C++关键字,所以应该去掉std::Deride * q= dynamic_cast<Deride*>(p); 需要提醒一下的是:用于动态转换shared_ptr的std:...原创 2018-12-20 11:58:57 · 6480 阅读 · 1 评论 -
C++11 std::unique_lock与std::lock_guard区别
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁--mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁。针对以上的问题,C++11...转载 2018-12-07 14:41:22 · 826 阅读 · 0 评论 -
configure 时-g 与 -O0 开关控制
实验了一下调试tslib首先是编译。1. 允许调试,如下配置。./configure --enable-debug --prefix=/opt但这样虽然增加了-g 选项,但仍然是-O2 优化,gdb debug 时会跳行,不爽。2. 变为-O0 选项,可以导出CFLAGS 变量,如下进行。export CFLAGS='-DGCC_HASCLASSVISIBILITY -...转载 2018-12-14 16:39:01 · 1434 阅读 · 0 评论 -
error: crosses initialization of XXX
错误代码:int main(){ int n=2; switch(n) { case 1: int temp=9; case 2: default: } return 0;}错误原因:所有的case和default没有使用{ },这意味着使用的是一个共同的作用域(switch的作用域)。编译器认为在case1中定义的tem...原创 2018-12-20 14:08:15 · 511 阅读 · 2 评论 -
C语言和C++11中的计时方法
https://blog.csdn.net/u013390476/article/details/50209603转载 2018-12-21 17:57:11 · 288 阅读 · 0 评论 -
Boost - 序列化 (Serialization)
https://blog.csdn.net/zj510/article/details/8105408转载 2018-12-28 11:19:00 · 700 阅读 · 0 评论 -
C++构造函数中抛出异常
构造函数中抛出异常会有怎样的影响呢?如下实验代码#include <iostream>#include <stdexcept>using namespace std;class A{ public: A(int n){} ~A(){cout<<"A destroy"<<endl;}};class B{ pub...原创 2018-12-28 18:01:45 · 2369 阅读 · 0 评论 -
VSCode显示所有函数列表
方法一:显示大纲方法二:Shift+Ctl+O原创 2019-01-11 21:01:57 · 113920 阅读 · 16 评论 -
C++11正则表达式错误terminate called after throwing an instance of 'std::regex_error' what(): regex_error
原因:C++11支持的正则表达式有限解决方案:使用boost库中的正则表达式 使用C++14原创 2019-01-14 12:00:04 · 4852 阅读 · 0 评论 -
GDB常用命令与技巧(超好用的图形化gdbgui)
目录一、常用命令二、调试脚本三、图像界面一、常用命令 命令 命令缩写 命令说明 list l 显示多行源代码 break b 设置断点 break if b if 当满足某个条件时停止 delete d 删除断点(包括watch 点),一般先使用info命令...原创 2019-01-09 10:44:44 · 22725 阅读 · 0 评论