c++编程技术
seasermy
专注AI算法研究与应用,AI软硬件协同优化,AI系统解决方案
展开
-
c++野指针如何处理?
野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少,对野指针进行操作很容易造成程序错误。原创 2024-03-17 08:57:23 · 475 阅读 · 0 评论 -
能不能绕过c去学c++?
c不直接支持面向对象编程(只能用struct模拟),而c++是一种面向对象的编程语,c++通过类和对象的概念,提供了封装、继承和多态等特性,使得程序更易于组织、重用和维护。c基本是系统底层语言,一般系统底层开发用c(例如,linux桌面操作系统和嵌入式操作系统),它主要用stdio.h,stdlib.h,string.h等头文件。c++是在c的基础上发展而来的,因此它们有许多共同的基础,如变量、数据类型、运算符等。c++保持了对c的兼容性,可以使用c的代码,并且c++编译器可以编译c的代码。原创 2024-03-17 08:56:03 · 4907 阅读 · 6 评论 -
c++的右值引用具体用法
在c++11中,支持右值引用,右值引用的用处之一是移动语义,对象的资源所有权发生转移,在c++11之前,移动语义的缺失是c++饱受诟病的问题之一.什么是左值?什么是右值?凡有名者,皆为左值.左值对应变量的存储位置,右值对应变量的值本身,右值可以被赋值给左值,或者绑定到引用.右值引用的优点?类的右值是一个临时对象,如果没有被绑定到引用,在表达式结束时候,就会废弃,在右值被废弃之前,移...原创 2019-12-24 13:57:17 · 1173 阅读 · 0 评论 -
c++11的mutex unique_lock和lock_guard区别
C++11中有一个区域锁lock_guard,还有第二个区域锁unique_lock。 区域锁lock_guard使用起来比较简单,除了构造函数外没有其他member function,在整个区域都有效。 区域锁unique_guard除了lock_guard的功能外,提供了更多的member_function,相对来说更灵活一些。 unique_guard的最有用的转载 2017-09-22 15:24:00 · 2169 阅读 · 0 评论 -
gdb如何打印程序中的stl变量
GDB的自定义命令非常有用,通过自定义命令,直接操作容器中的数据,可以方便的查看STL容器中的数据。这个链接dbinit_stl_views是Dan C Marinescu写的查看STL容器的自定义命令(如果不适合你的STL版本的话,可以自行修改)。把它添加到你的.gdbinit中,就可以方便的查看STL容器了。它提供了查看vector,list,map,multimap,set,multiset转载 2017-11-17 13:46:27 · 1317 阅读 · 0 评论 -
编译FFmpeg静态库
ffmpeg是很好的开源工具,对做视频理解来说很有帮助,内部机制也很经典,经过优化后的ffmpeg解码效率更高(例如:多线程解码、关键帧解码、GPU解码等),唯一的缺点是文档比较乱,有的功能接口使用比较不清晰,有时候,需要编译ffmpeg的静态库,方便部署:./configure --prefix=$FFMPEG_HOME--pkg-config-flags="--static" ...原创 2019-04-04 11:37:27 · 5728 阅读 · 1 评论 -
如何将caffe的data prefetch变为多线程预取?
在深度学习研究时,数据预取会经常成为训练的瓶颈,一般来说,判断瓶颈的时候,看GPU利用率即可。通过nvidia-smi或者watch -n 1 nvidia-smi(实时刷新)都可查看GPU的利用率。如上图所示,GPU利用率不能完全打满,断断续续的忽高忽低,大概率是因为数据取出速度慢 (其他原因,如GPU带宽一般不会成为瓶颈)。除此之外,在blocking_queue.cpp中也会打印出...原创 2019-04-17 10:31:54 · 1581 阅读 · 1 评论 -
scikit-image : ValueError: Invalid mode specified. Please use `constant`, `edge`, `wrap`, `reflect`
ValueError: Invalid mode specified. Please use `constant`, `edge`, `wrap`, `reflect` or `symmetric`.在caffe中,或者其他场合应用scikit-image解码图像及做preprocess的时候,会碰到这个问题有人说,直接升级会解决这个问题,经过尝试,并不见效需要降低版本,例如,我原来...原创 2019-04-24 11:29:32 · 1657 阅读 · 1 评论 -
tensorflow c++推理,如何为input tensor赋值?
tensorflow是个强大的数值计算工具,同时也是强大的深度学习工具.当我们在用c++ api做推理的时候,如何将数据输入tensorflow, 有时候会感到迷惑,本文以图像分类为例子,做简单的说明:我们还是以tensorflow examples中的label_image为例子进行说明.在例子中,main.cc用了ReadTensorFromImageFile函数从jpeg文件中解码并赋值...原创 2019-05-14 15:53:29 · 3759 阅读 · 5 评论 -
c++模板类的两阶段查找
在c++里, 模板类在编译的时候,与独立类不同,需要经过两阶段查找,明白两阶段查找,对于解决诡异的编译错误,帮助很大1. 什么是两阶段查找:(1) 在模板定义阶段,先对独立的(与模板参数无关的)成员进行检查,检查不通过则编译报错;(2)在实例化模板时,对非独立的成员进程检查(检查是否在子类或基类中)举例: #include <stdio.h> ...原创 2019-05-14 17:29:20 · 1113 阅读 · 0 评论 -
一些常用STL函数总结,省事的函数
stl是好用的东西,这些函数,省掉你写for函数的麻烦,如下:累加 (std::accumulate)accumulate(begin, end, init, op)返回给定区间内元素的累加值与给定初值的和,初值不可省略可指定求和运算,默认为std::plusvector<int>vec = {1, 2, 3, 4};cout<<accumulate...原创 2019-08-29 10:59:00 · 546 阅读 · 0 评论 -
c++的动态类
特色源于变化,不变的东西,不灵活的东西,一般会失去光辉,技术也是,如果一个技术容易扩展,那么它是一个好技术今天介绍c++的动态类特性:在介绍之前,先介绍c++11中的两个关键字,auto和any,(1)autoauto可以表示任何类型,是c++11中的一个关键字符号,可以使得代码简洁,不用关心具体的类型,类型在编译器编译的时候决定:如: auto a = 5;原创 2017-09-14 14:16:37 · 2316 阅读 · 2 评论 -
软件的不同版本说明
Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。RC:(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。GA:General Availability,正式发布原创 2017-08-28 16:28:46 · 758 阅读 · 0 评论 -
std::function
看看这段代码先来看看下面这两行代码:std::functionvoid(EventKeyboard::KeyCode, Event*)> onKeyPressed;std::functionvoid(EventKeyboard::KeyCode, Event*)> onKeyReleased;这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊。std::fu转载 2016-12-28 17:14:06 · 377 阅读 · 0 评论 -
堆和栈的区别
刚才在工作中分析了同事询问的一个关于堆和栈的问题,这样的问题确实很复杂,本来c++细节就多,今后需要更加完善及注意,简单总结如下:堆和栈,针对的只是变量的存储位置,而不是针对函数,函数有函数的存放位置;如何判断变量(准确的说是变量内存)是在堆,还是在栈上?几个准则吧:(1)全局变量(初始化和未初始化)、静态变量是在全局区,而不是在栈或堆上;原创 2014-12-24 17:48:10 · 716 阅读 · 0 评论 -
allocator之rebind
今天实现了一个粗陋的stl allocator ,算是一天时间,没有白费,希望今后对STL原理更加理解深入吧,同时,对c++的细节更多的进行试验和掌握。自定义allocator中比较关键,和难于理解的是rebind这个结构体模板,其实静下心来就好理解了,这是针对节点型容器的适配吧算是,class allocator{templatestruct rebind原创 2014-12-25 19:21:45 · 1636 阅读 · 0 评论 -
以类成员的方式重载new delete
在类成员中重载new和delete, 必须声明为static类型,这是因为,在new的时候,对象并没有constructor或destructor, 不存在this指针,所以利用static函数的特性就可以正确的重载new和delete作为成员函数。原创 2015-05-14 18:59:04 · 861 阅读 · 0 评论 -
字符串匹配之BM算法
最近,涉及到android下的c++开发,但是麻烦在于,在android平台下编译的话,如果使用了标准库中的iostream, fstream等,会使得编译出来的二进制代码体积过度膨胀,所以需要去除iostream等标准库的使用,当然, STL中的模板也会使得代码体积增大, 是由于string间接包含了其他标准库文件;同时,std::string采用模板技术,所以效率也不高原创 2015-06-23 13:32:37 · 754 阅读 · 0 评论 -
linux下增加环境变量
在linux或者android系统上做c++ native开发的时候,因为程序部署的需要,经常是多个so共存,并且可能so之间有加载依赖,,那么,在程序启动的时候,需要设置环境变量,设置环境变量的方法如下:1.environ变量:environ变量的声明如下:#include extern char **environ;这个变量是用来打印环境变量。#incl原创 2015-07-13 15:06:06 · 851 阅读 · 0 评论 -
c++类的前向声明
在大型工程中,如何避免头文件中过多的包含其他类的头文件,从而引起编译时间剧增,强依赖性?即:在头文件中,利用类的前向声明,而不是直接包含类的定义头文件;c++编译器在编译的时候需要确定符号的大小,所以类前向声明对于类指针,类引用,类形参和返回值,见效;但是,对于成员变量,则不能利用前向声明去定义,因为确定不了成员大小,切记!原创 2015-09-08 17:08:07 · 688 阅读 · 1 评论 -
new内存时,数组长度为0
c++ new的时候,如果长度为0,虽然会有指针产生,但是 则会产生意想不到的错误,int * array = new int[0];array[0] = 0;虽然能访问,但是,取决于正在访问的内存是不是有人在使用或占用,如果有人使用,则该内存不是野内存,会报错;o长度的动态分配数组,delete的时候也会有报错出现,找不到内存;这种情况原创 2015-11-12 10:47:29 · 2157 阅读 · 0 评论 -
openssl rsa应用与分析
rsa,des,urldecode,hexdecode作为网络数据传输与请求中非常重要的编码方法,具有重要的意义opennssl作为强有力的开源,为广大c++开发者提供了很大方便,但是,繁杂的api接口,缺乏文档,使其并不好用,下面仅提供RSa的简单实现,加密解密逻辑,直接上代码1. Rsa.h#ifndef RSA_H_#define RSA_原创 2015-09-17 18:10:00 · 872 阅读 · 0 评论 -
linux编译boost
linux平台下要编译安装除gcc和gcc-c++之外,还需要两个开发库:bzip2-devel 和python-devel,因此在安装前应该先保证这两个库已经安装:#yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel -y然后是去官网下载源码包,地址下载,解压,按照如下步骤:#tar xvzf boos转载 2015-12-14 13:33:50 · 428 阅读 · 0 评论 -
c++11中的lambada表达式
C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解。lambda表达式的语法如下所示:[capture_block](parameters) exceptions_specification -> return_type {body}[捕捉快](参数) 异常 -> 返回值类型 {主体}转载 2016-12-28 17:11:01 · 2440 阅读 · 0 评论 -
c++拷贝构造函数和赋值构造函数
今天,同事询问一个关于程序中的引用与效率问题,姑且简单解释如下:1. 引用:变量的一个纯粹的别名;不像java中的引用,java中的引用更像是limited指针;2. 利用引用传递参数,能避免调用类拷贝构造函数的开销;同理,返回对象的引用,也能避免一次拷贝构造函数调用开销;当然,返回的是非局部变量的引用,提防局部变量析构所引起的不安全;3. 何时调用原创 2014-12-24 12:18:35 · 851 阅读 · 0 评论