![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 70
kangshuangzhu
这个作者很懒,什么都没留下…
展开
-
tensorflow 之 graph
首先看graph 的初始化,tensorflow::Graph是一个类,定义和初始化的方法都在tensorflow/core/graph/graph.cc 和 tensorflow/core/graph/graph.h。本节介绍tensorflow中的graph,在c_api.cc 中有创建graph的例子,可以从这个为切入点,探索graph的使用。通过调用TF_Graph来创建一个图,TF_Graph的定义在tensorflow/c/c_api_internal.h。原创 2023-01-28 17:11:22 · 714 阅读 · 0 评论 -
c++ constexpr 关键字
constexpr 用于修饰一个函数,表示在编译期间就能得到其返回值,而不是在运行期间得到。而宏是在预编译期间就做了置换。1. constexpr 函数体必须有return 函数,且只能有return函数。2. constexpr 不允许出现变量,因为是在编一阶段。上面代码虽然不会报错,但是会报警告。原创 2023-01-17 10:18:52 · 317 阅读 · 0 评论 -
c++ 类成员初始化和函数对象
上面的例子中,对于FeatureValue的类成员初始化比较好理解,把2 赋给sss,因为sss本就是int。然后后面Feature 是比较反常的,kkk是一个类,但是却可以直接用这种方式进行初始化。类成员可以在构造函数中进行初始化,具体写法是。且这种写法可以连续传递。原创 2023-01-17 00:51:31 · 155 阅读 · 0 评论 -
c++ 宏中的... , __VA_ARGS__, __COUNTER__, #、##、#@
新的C99规范支持了可变参数的宏,省略号表示可变的参数,而__VA_ARGS__一般用于宏的右边表示被省略的参数。把宏字符串话,换句话说就是把宏两两边加上“”,例如。例如我们新建一个文件test_macro.cc。然后下面的命令做预编译。即可得到宏的真实定义。原创 2023-01-16 19:33:12 · 420 阅读 · 0 评论 -
tensorflow之graph_def
图是我们最熟悉的基本结构,从我们一开始使用tensorflow就会接触到这个概念,graph的类结构同样定义咋一个proto中tensorflow/core/framework/graph.proto。在文件tensorflow/core/graph/graph_def_builder.h 中是graphDef的定义中,除了proto定义的属性,还提供了一个子类options。在图构建完成以后,会把图做一些分割,相同的节点会放在一个子图中,然后在运行图的过程中,运行各个子图。原创 2023-01-13 19:39:41 · 385 阅读 · 0 评论 -
tensorflow kernel注册
我们来看构造函数,Device函数, Build函数的定义。在宏中,调用了函数Name,然后是设置了device,然后调用了build(). 联想到opDefBuilder的用法,我们可以猜到,Name应该是生成了一个类似于kernelDefBuiler的对象,.Device() 函数类似于opDefBuilderWrapper中函数,返回对象自身,然后通过builder创建一个kernelDef 类。调用了函数 InitInternal,这个函数后面再讲,我们先弄明白几个入参的含义。原创 2023-01-11 15:55:07 · 405 阅读 · 0 评论 -
tensorflow的op注册源码精读
在自定义的算子时,经常遇到一些函数和宏,这里介绍一下常见的函数和宏。原创 2023-01-11 14:00:11 · 869 阅读 · 0 评论 -
用cmake工具 自定义tensorflow算子
自定义tensorflow算子有两种方式:1. 下载tensorflow源码,在源码中添加cpp代码,然后编译安装。这种方法的优点是自定义的算子一起被打包进tensorflow,形式比较统一。当然缺点也很明显,其他人想调用该算子时,需要重新安装tensorflow2. 代码独立编译成动态链接库,然后再tensorflow中调用。这种方式的优点是非常灵活,编译开发的工作量比较小。还有一种方式是把算子编译成第三方库,这种方式一般比较少用,所以下面就第二种方式讲解一下自定义算子的过程。原创 2023-01-10 17:22:15 · 478 阅读 · 1 评论 -
cmake 工具 三 add_libary, set_target_properties,target_link_libary,link_directories, link_libary
一起通过一个例子学一下 add_libary, set_target_properties,link_libary, target_link_libary 四个命令首先创建如下的文件:其中 build用于cmake编译,防止大量编译的中间文件污染代码文件夹具体可见int_plus 的作用就是两个数相加,int_con就是两个数相减,特别简单,这里不放代码了。原创 2022-11-15 20:32:19 · 1681 阅读 · 0 评论 -
c++ 常用STL 之set
关联式容器则大不一样,此类容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。应用最灵活的还是用迭代器初始化,同样的,用迭代器初始化,不要求迭代器是set的迭代器,任何迭代器都可以。因为元素是有序的插入到set中的,所以,set是无序的,不能用下表或者at函数来取某一个值。size() 获取set的大小。原创 2022-11-01 13:02:44 · 1072 阅读 · 0 评论 -
c++ 匿名函数和lambda函数
对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?使用 Lambda 表达式可以减少程序中函数对象类的数量,使得程序更加优雅。时,往往会大量用到函数对象,为此要编写很多函数对象类。有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费。而且,定义函数对象类的地方和使用函数对象的地方可能相隔较远,看到函数对象,想要查看其 operator() 成员函数到底是做什么的也会比较麻烦。中也可以不使用定义在外面的变量。其中,“外部变量访问方式说明符”可以是。原创 2022-10-31 11:33:41 · 90 阅读 · 0 评论 -
c++ 中头文件
而有了#ifdef 以后,在第二次复制的时候由于宏INT_PLUS_H已经存在,所以会认为int_plus.h文件是空的,不会重复复制。但实际写代码时,我们可能会调用非常多的函数,同一个函数也可能被不同的代码反复调用,每次调用我们都写一个同名函数不仅繁琐而且容易出错。我们只需要在主程序中定义一个同名的函数就行,在编译时,会把各个.cc文件全部编译成二进制,然后通过函数名链接起来。头文件是一个给出函数,对象、结构体的定义的文件,一般不在头文件中写具体的逻辑代码。例如在上面的例子中,会写成。..........原创 2022-08-08 22:39:16 · 2649 阅读 · 0 评论 -
CMAKE 工具 之 add_executable,include_directories和 AUX_SOURCE_DIRECTORY
在上一章里面,我们用cmake做了一个最简单的项目,这一节我们尝试一写比较常见的cmake配置。这次我们构建如下的目录结构。原创 2022-08-03 23:56:44 · 1826 阅读 · 0 评论 -
c++ 中的符号* 和 &
* 和 & 是c++中非常常见的一对符号。但实际使用中有极其多的变化需要注意。先说* , 严格地说,符号*其实有2个作用:1. 当* 出现在声明变量或者函数的时候,意为该变量或者函数为一个指针2. 其他场景* 意为对变量取数值而不能单纯的把*理解成取值,否则会出现矛盾例如int a = 20;int *b = &a;std::cout << *b << std::endl;从第二行来看,我们把a的地址赋给了*b,但是明显第三行打印出来原创 2022-02-06 21:35:55 · 23944 阅读 · 4 评论 -
c++网络编程(一)socket() 从文件描述符说起
综述c++网络编程的通信过程如下无论是服务器端还是客户端,都是从socket开始,那么socket是什么呢?实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、conn...原创 2019-08-07 23:49:47 · 1917 阅读 · 1 评论 -
c++编程之perror()
定义函数 void perror(const char *s); perror ("open_port");函数说明 perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。在库函数中有个errno变量,每个...原创 2019-08-09 01:07:12 · 1765 阅读 · 0 评论 -
vscode调试c++设置方法
自从vscode出了远程模式,再结合win10的内置linux子系统,就大大改善了对开发人员的友好度。今天尝试了一把在vscode上调试c++程序,中间踩了不少坑。我们知道c++是一个高级语言,需要编译后才能调试,不像python这样的解释性语言。这个特点在linux环境里调试c++就表现得很充分,在linux中,通过编译命令生成二进制文件或是可执行文件g++ -g filename -...原创 2019-08-07 03:15:34 · 14100 阅读 · 1 评论 -
c++网络编程(二)网络通信函数
上一章已经提到,bind()函数可以将网路设备和网络地址连接在一起。c++网络通信中的众多函数bind()函数,将设备与地址连接在一起的桥梁在上一章介绍了socket,对网络设备占用的文件描述符和记录网络访问信息的结构体sockaddr、sockaddr_in之间是独立的。如果我们是客户端,利用网络设备和访问地址、端口进行访问请求,如果我们是服务器端,则是通过网络设备和来访地址、端口应对其...原创 2019-08-09 20:11:20 · 936 阅读 · 0 评论 -
c++标准库
在最新的c++标准中,为了把c++和C语言的标准库分开。对一些C语言的标准化库进行了重命名,在头文件前加上c,并且去掉了.h的后缀。但是由于历史遗留问题,仍旧有很多c++沿用旧的标准和旧的头文件格式。不过新的标准仍然是历史潮流,在写代码时最好了解哪些库属于标准化库,使用最新标准。C++标准库经过补充修改,一共有10大类。一、C++标准库 C++标准库的内容分为10类,分别是(建议在阅...原创 2019-08-07 20:56:01 · 169 阅读 · 0 评论 -
C++中的指针初始化
C++中定义一个指针的时候,例如int *p。可以认为定义了两个内容,1:指针,2:指针的指向。需要对指针本身和指针的指向都进行初始化,既要初始化内存地址,也要定义内存中的内容。如果不进行指针的初始化,则内存地址随机分配。格根据编译器的不同,会出现警告或者报错不同等级的问题,在编译中也可能出现难以察觉的bug。指针的初始化时等号左右两端都必须是内存地址。例如int a;int ...原创 2019-08-04 21:22:56 · 19323 阅读 · 0 评论