
C/C++
文章平均质量分 69
FesianXu
腾讯-微信事业群-高级算法工程师, 百度-搜索策略部-前高级算法工程师。 主要从事多模态检索、视频检索、信息检索,大模型落地应用等领域工作。
展开
-
C语言函数内形式参数的入栈顺序是UB行为
最近在学校论坛看到一个关于C语言的问题,如下文这段代码,期待中的输出应该是5,5,但是在gcc中的结果实际是7,3,而在clang中的结果则是期望中的5,5。为什么会产生这种区别呢?其原因就在于printf("%d,%d\n", (++p)->a, (p++)->a);这句,因为在形参传参过程中,左参数(++p)->a和右参数(p++)->a不是彼此独立的,而是会相互影响,因此编译器在解释函数传参过程中,从左到右入栈还是从右到左入栈的顺序就至为关键,不凑巧的时,这个顺序在C语言标准中原创 2021-03-28 20:12:20 · 616 阅读 · 0 评论 -
pytorch中的ReLU与inplace原地操作的一些注意点
pytorch中的ReLU与inplace原地操作的一些注意点 FesianXu 20210210 @ Baidu intern前言pytorch中的原地操作有时候很容易造成一些错误使用的情况,造成非期望的结果而且不容易调试,本文进行一些小记录。 如有谬误请联系指出,本文遵守 CC 4.0 BY-SA 版权协议,转载请联系作者并注明出处,谢谢。∇\nabla∇ 联系方式:e-mail: FesianXu@gmail.comgithub: https://github.com/Fes.原创 2021-02-10 11:58:56 · 2097 阅读 · 1 评论 -
引用与指针的区别
引用 (&)与指针(*)都可以在C++中用于表示一个对象的间接引用,其唯一差别似乎只有obj.member和pobj->member类似的用法上的区别。但其实这两者在C++里面的具体用法和设计思想都不同的。我们知道在函数传参数时,默认是值传递,意味着需要在传参数时对传入参数进行拷贝构造,在返回时,如果也是值传递,那么同样需要进行拷贝构造。 作为一种更为高效的方法,是合适地进行引用传递,只是在函数传参和返回时传入和返回其对象的间接引用,使得这个过程更为高效,如:int computeGradi原创 2021-02-05 15:03:39 · 231 阅读 · 0 评论 -
const修饰符并不保证运行时的常数性质
∇\nabla∇ 联系方式:e-mail: FesianXu@gmail.comQQ: 973926198github: https://github.com/FesianXu知乎专栏: 计算机视觉/计算机图形理论与应用微信公众号:const和volatile修饰符统称为cv修饰符,用于指示编译器是否允许一个程序中的某个变量的内存是否在初始化后,仍允许被修改。其中的volatile我们已经在前文[1]中讨论过了,我们讨论下const的一些特性。我们知道,cv修饰符都是给编译器看的,用于指导编原创 2021-01-20 21:21:08 · 266 阅读 · 2 评论 -
do{}while(false)结构的妙用
今天看源码的时候,发现某个框架的源码里面经常出现如下片段:do{ if (ASSERT(some_input_1) && ASSERT(some_input_2)) { ... }} while(false)我对于do{} while(false)结构的使用,在此之前无非两种,第一种是基本用法,也就是把它当成循环结构使用,和for(;;),while(){}没太大区别;还有一种用法是用在宏定义中,如下所示:#define LARGER(x,y) do { x > y原创 2021-01-12 23:44:47 · 1556 阅读 · 0 评论 -
[darknet源码系列-2] darknet源码中的cfg解析
[darknet源码系列-2] darknet源码中的cfg解析 FesianXu 20201118 at UESTC前言笔者在[1]一文中简单介绍了在darknet中常见的数据结构,本文继续上文的节奏,介绍如何从cfg文本文件中解析出整个网络的结构与参数。如有谬误请联系指出,本文遵守 CC 4.0 BY-SA 版权协议,转载请联系作者并注明出处,谢谢。∇\nabla∇ 联系方式:e-mail: FesianXu@gmail.comQQ: 973926198github:...原创 2020-11-20 20:30:53 · 1069 阅读 · 0 评论 -
[darknet源码系列-1] darknet源码中的常见数据结构
[darknet源码系列-1] darknet源码中的常见数据结构 FesianXu 20201117 at UESTC前言最近笔者在好奇如何从最底层开始搭建一个深度学习系统,之前都是采用现成的成熟深度学习框架,比如PyTorch,TensorFlow等进行模型的搭建,对底层原理了解不是特别深刻。因此笔者最近在阅读darknet的源码,希望能从中学习到一些底层的知识,本文主要是对darknet中常见的数据结构进行记录和分析。如有谬误请联系指出,转载请联系作者并注明出处,谢谢。∇...原创 2020-11-18 17:41:53 · 1168 阅读 · 2 评论 -
[C语言朝花夕拾] C语言中的命令行输入参数判断
在C语言中,我们的函数入口经常会有:int main(int argc, char** argv) { ... return 0;}类似这样的传入参数,这类型的参数是为了,用户在利用命令行调用该程序的时候,能够传入适合的参数去控制程序的特定行为。例如,假如现有程序:#include <stdio.h>int main(int argc, char** argv) { printf("number of arg %d\r\n", argc); int i = 0; for原创 2020-11-17 15:59:43 · 1688 阅读 · 0 评论 -
用“位操作”取代“取模操作”判断奇数偶数
在刷题过程中,我们经常会遇到需要判断某个整数是奇数还是偶数的情况,这个时候,我们可能会采取取模的操作,直接判断,如:num % 2 == 0;num % 2 == 1;然而,取模操作是非常慢的(按照速度来说,位移操作>=加减法>>乘除法,取模,具体见文末的备注),因此我们应该尽量避免使用取模操作,在判断奇数偶数时,我们可以用位操作替代取模操作,因为我们知道,偶数可以被2整...原创 2020-03-31 18:36:02 · 1514 阅读 · 0 评论 -
[LeetCode刷题笔记] C++ unordered_set常用操作
在[1]对常用的STL容器进行了概览,笔者在刷题过程中经常需要查询一些STL容器的函数,实为不便,因此在此对STL容器中常用的操作进行笔记。std::unordered_set<key>是一种STL提供的无序集合的类,集合的特点就是其中没有任何重复的元素,这个特点非常适合用于纪录某个数据中是否有重复的数据,并且将其挑出来。std::unordered_set其和std::set不同...原创 2020-02-23 21:28:14 · 4667 阅读 · 0 评论 -
[LeetCode刷题笔记] C++ unordered_map常用操作
在[1]对常用的STL容器进行了概览,笔者在刷题过程中经常需要查询一些STL容器的函数,实为不便,因此在此对STL容器中常用的操作进行笔记。std::unordered_map<key, T> 是一种关联性的容器,类似于Python中的dict字典,其特点就是可以通过键值key在近似于常数时间内进行内容的检索和修改等。注意到其和std::map不同的一点是,其是无序的,也就是说插...原创 2020-02-23 20:39:46 · 2905 阅读 · 0 评论 -
[LeetCode刷题笔记] C++ priority_queue常用操作
在[1]对常用的STL容器进行了概览,笔者在刷题过程中经常需要查询一些STL容器的函数,实为不便,因此在此对STL容器中常用的操作进行笔记。std::priority_queue<T>定义于头文件<queue>中,是所谓的优先队列,一般的队列,如同[2]中所示,是先进先出的,不需要对插入对象的大小或者其他属性进行排序等,而优先队列可以提供插入对象与现存对象之间的比较机制...原创 2020-02-23 11:12:30 · 706 阅读 · 0 评论 -
[LeetCode刷题笔记] C++ stack常用操作
在[1]对常用的STL容器进行了概览,笔者在刷题过程中经常需要查询一些STL容器的函数,实为不便,因此在此对STL容器中常用的操作进行笔记。std::stack<T>是STL库中实现了后进先出的数据栈的数据结构,同样是属于对std::vector<T>进行了某些操作限制(比如不允许任意地方插入或者删除元素)的一种数据类型,对这些操作进行限制是为了防止人为在无意或有意中...原创 2020-02-23 01:35:24 · 805 阅读 · 0 评论 -
[LeetCode刷题笔记] C++ queue常用操作
在[1]对常用的STL容器进行了概览,笔者在刷题过程中经常需要查询一些STL容器的函数,实为不便,因此在此对STL容器中常用的操作进行笔记。std::queue<T>是STL库中的实现队列的类,队列是一种先入先出(First-In-First-Out, FIFO)的数据结构,其可以看成是std::vector<T>进行了某些操作的限制(比如不能任意地方插入,删除元素等...原创 2020-02-23 01:22:12 · 722 阅读 · 0 评论 -
[LeetCode刷题笔记] C++ vector常用操作
在[1]对常用的STL容器进行了概览,笔者在刷题过程中经常需要查询一些STL容器的函数,实为不便,因此在此对STL容器中常用的操作进行笔记。std::vector是一种线性数组,每个元素的数据类型都相同,不过和一般的静态的数组不同的是,其允许通过插入元素,删除元素实现所谓的动态数组,是常用的数据结构,类似于python中的列表list。其涉及到的常用操作有几大类:初始化操作,涉及到初始化...原创 2020-02-23 01:05:29 · 2826 阅读 · 1 评论 -
C++ STL标准库容器 概览
前言本文对C++中的STL标准库容器进行概览,作为笔者平时的学习笔记,以兹备忘。同时,本文作为一个目录,接下来对常用容器,比如vector,map等的 具体介绍的博文将会由本文进行索引。C++的标准容器库中提供了一系列的容器模版,可以作为日常工作生产中的数据结构使用,以此减少了程序员很多去造轮子的工作量。容器(container),顾名思义,是一种按照某种特性,用于储存某种类型数据的一种数据...原创 2020-02-05 23:07:49 · 564 阅读 · 0 评论 -
C语言中去除不必要的内存引用可以有效地提高性能
在C语言中,我们经常会存在对某个内存地址进行引用的操作,也就是如下列代码所示的,对指针进行取内容:int vars[10];int var = *(vars+3); //这里就是对数组vars的第三个元素进行引用这种内存引用操作对应的汇编代码通常如:mov (%rax), %rdx; # 把地址位于%rax的内存值进行取出。mov 12(%rax), %rdx;# 把地址位于%ra...原创 2020-02-02 22:24:12 · 873 阅读 · 1 评论 -
c语言中内循环和外循环的位置可能产生性能上的区别
在图像处理相关的代码中,我们经常有类似于以下的代码,去遍历多维数组(张量)的每一个元素:#define LENGTH 10000void proc(){ uint8 datas[LENGTH][LENGTH]; int i, j; long long sum = 0; for (i = 0; i < LENGTH; i++){ for (j = 0; j < LENGT...原创 2020-02-01 00:01:49 · 3410 阅读 · 2 评论 -
c语言运行时出现segment fault的原因
segment fault段错误是在编程报错中经常出现的,特别是在c语言编程中,尤其常见,其原因本质上上是访问了非法(不属于这个程序)的内存地址空间,具体来说有以下几种情况:局部变量定义中,使用了过大的局部变量,大于了系统给之的栈(stack)的大小,因此报错。比如以下代码在linux环境下,就可能出现段错误报错:void foo(){ float vars[10000][10000];...原创 2020-01-31 21:38:04 · 3979 阅读 · 0 评论 -
一文理解C语言中的volatile修饰符
一文理解C语言中的volatile修饰符 2019/12/2 FesianXu前言volatile修饰符是在嵌入式开发和多线程并发编程中常见的修饰符,理解其对于实践过程非常有帮助,此文参考了[1],并且附上了笔者的一些例子,希望对大家有所帮助。∇\nabla∇联系方式:e-mail: FesianXu@gmail.comQQ: 973926198github: ...原创 2019-12-02 20:23:19 · 1179 阅读 · 1 评论 -
C语言中的内存布局(memory layout)
C语言中的内存布局(memory layout) 2019.11.20 FesianXu前言最近看了关于内存布局的文章[1],感觉讲的很好,结合他这里的原文,这里做大部分的翻译和理解注释等,希望对各位有所帮助。∇\nabla∇联系方式:e-mail: FesianXu@gmail.comQQ: 973926198github: https://github.com...原创 2019-11-21 15:44:05 · 3450 阅读 · 0 评论 -
<C语言漫谈录>5——原码,反码,补码,大端模式与小端模式
————————————————————————————————————————————————前言:关于C语言的书,那是数不胜数,其中不乏佳作。我在这里并不打算从头开始讲解C语言,因为那种书籍实在太多了,这里就像个漫谈录,我们想到哪里讲哪里,希望能把一些原理性的东西描述的清楚一些,和大家分享自己的一些心得。如果对内容有任何建议或者内容有纰漏的地方,请大家一定要告诉我,方便我完善,谢谢大家原创 2016-12-15 14:15:30 · 1888 阅读 · 0 评论 -
<C语言漫谈录>4——其他内置数据类型
————————————————————————————————————————————————前言:关于C语言的书,那是数不胜数,其中不乏佳作。我在这里并不打算从头开始讲解C语言,因为那种书籍实在太多了,这里就像个漫谈录,我们想到哪里讲哪里,希望能把一些原理性的东西描述的清楚一些,和大家分享自己的一些心得。如果对内容有任何建议或者内容有纰漏的地方,请大家一定要告诉我,方便我完善,谢谢大家原创 2016-12-14 14:49:54 · 833 阅读 · 0 评论 -
<C语言漫谈录>3——关键字,变量定义和声明
————————————————————————————————————————————————前言:关于C语言的书,那是数不胜数,其中不乏佳作。我在这里并不打算从头开始讲解C语言,因为那种书籍实在太多了,这里就像个漫谈录,我们想到哪里讲哪里,希望能把一些原理性的东西描述的清楚一些,和大家分享自己的一些心得。如果对内容有任何建议或者内容有纰漏的地方,请大家一定要告诉我,方便我完善,谢谢大家原创 2016-12-14 14:07:48 · 1244 阅读 · 0 评论 -
<C语言漫谈录>2——C语言之路启程
什么是汇编指令系统在了解什么是汇编之前,我们先要知道什么是指令系统。指令系统如其名所示,就是整个计算机所支持的全部指令的集合,比如说上一节提到过的ADD,MUL等等。这些指令从计算机看来都是机器语言,什么叫机器语言呢? 因为计算机作为一个数字系统[1],一般只能识别二进制码,也就是00100011000100···类似的二进制串,我们想要和计算机交互,让计算机运行我原创 2016-12-13 23:44:23 · 717 阅读 · 0 评论 -
<C语言漫谈录>1——背景知识
—————————————————————————————————————————————————前言:关于C语言的书,那是数不胜数,其中不乏佳作。我在这里并不打算从头开始讲解C语言,因为那种书籍实在太多了,这里就像个漫谈录,我们想到哪里讲哪里,希望能把一些原理性的东西描述的清楚一些,和大家分享自己的一些心得。如果对内容有任何建议或者内容有纰漏的地方,请大家一定要告诉我,方便我完善,谢谢大家!原创 2016-12-13 22:39:01 · 912 阅读 · 0 评论