C++ sizeof分析
首先明确,sizeof不是一个函数,它是一个运算符!
1234567891011char str[] = "Hello";char* pstr = str;const char* str_list[] = { "Hello","world"};void* pbuf = malloc(100);int n = 10;sizeof(str)sizeof(pstr)sizeof(str_list)sizeof(pbuf)sizeof(n)
64 位机上,分析一下输出结果。
字符数组的大小包括 ‘\0’,“Hello” 有 5 个字符,加上 ‘\0’,sizeof(str) 大小为6。
64 位机,因为寻址的原因,需要8个字节来存储指针的大小,因此 sizeof(pstr) 的大小为8。
最困惑的要属 sizeof(str_list) 了。一开始认为,字符数组指针也是指针,所以输出应该是 8,但程序输出的结果却是 16。经查证,[] 的优先级比 * 要高,因此 str_list 先和 [] 结合,它还是 ...
值传递和引用传递
参考C++那些事——const那些事
关于引用传参:
对于非内部数据类型的参数而言,像 void func(A a) 这样声明的函数注定效率比较低。因为函数体内将产生 A 类型的临时对象用于复制参数 a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为 void func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数 void func(A &a) 存在一个缺点:
“引用传递”有可能改变参数 a,这是我们不期望的。解决这个问题很容易,加const 修饰即可,因此函数最终成为 void func(const A &a)。
以此类推,是否应将 void func(int x) 改写为 void func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
小结:对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将 void func ...
Let’s Build A Simple Interpreter. Part 5.
出处:https://ruslanspivak.com/lsbasi-part5/
Let’s Build A Simple Interpreter. Part 4.
出处:https://ruslanspivak.com/lsbasi-part4/
Let’s Build A Simple Interpreter. Part 3.
出处:https://ruslanspivak.com/lsbasi-part3/
Let’s Build A Simple Interpreter. Part 2.
出处:https://ruslanspivak.com/lsbasi-part2/
Let’s Build A Simple Interpreter. Part 1.
出处:https://ruslanspivak.com/lsbasi-part1/
C++常见问题总结
虚函数工作原理
c++引用与解引用
继承和动态内存分配
java/c++/rust对象复制之间的区别
new和malloc到底哪里不一样
为什么需要字节对齐以及如何对齐
仔细讨论 C/C++ 字节对齐问题
string 和 string.h 的区别
值传递和引用传递
sizeof分析
分配器
C++中的::
ptrdiff_t, size_t, difference_type
vector初始化方式
typename的由来和用法
typename 关键字
智能指针
C++11 std::funcion和std::bind
类模板中的编写方式及友元函数在类模板中的使用
命名空间里的友元函数
c++11模板类型推导规则
C语言正确使用extern关键字
extern “C“的作用及理解
继承和动态内存分配
以下的内容全部出自《C++ Primer Plus(第六版)中文版》13.7章节,继承和动态内存分配。
当基类和派生类都采用动态内存分配时,派生类的析构函数、复制构造函数、赋值运算符都必须使用相应的基类方法来处理基类元素。
例如:
12345678910111213class baseMDA{private: char * label; // 在构造函数中使用new int rating;public: baseDMA(const char * l = "null", int r = 0); baseDMA(const baseDMA & rs); virtual ~baseDMA(); baseDMA & operator=(const baseDMA & rs);...};
12345678class hasDMA : public baseDMA{private: char * style; // 在构造函数中使用newpublic:...};
对于析构函数,这是自动完成 ...
C++ new和malloc到底哪里不一样(转载)
出处:https://www.cnblogs.com/lcgbk/p/14118782.html
虚函数工作原理
联编
将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在编译过程中进行联编被称为“静态联编”,在程序运行时进行联编称为“动态联编”。
c++ 对非虚方法使用静态联编,对虚方法使用动态联编。
虚函数的工作原理
调用虚函数时,程序将查看存储在对象中的 vtbl 地址,然后转向相应的函数地址表。
虚函数对内存和运行速度的影响
使用虚函数,在内存和执行速度方面有一定的成本,包括:
每个对象都将增大,增大量为存储地址的空间;
对于每个类,编译器都将创建一个虚函数地址表(数组);
对于每个函数调用,都需要执行一项额外的操作,即到表中查找地址。
注意
构造函数不能是虚函数,派生类不继承基类的构造函数,所以将构造函数声明为虚的没什么意义。
析构函数应当是虚函数,除非类不用做基类。
友元不能是虚函数,因为友元不是类成员!只有成员才能是虚函数。
纯虚函数
纯虚函数提供未实现的函数,声明的结尾处为=0,如
1virtual double Area() const = 0;
或
1double Move(int nx, ny) = 0;
类中包含纯虚函数时,不能创建该类 ...
汇编语言学习记录(一)
因写操作系统的需要 https://lushuangning.github.io/posts/556622b0/,在此单独开一篇记录汇编语言学习的历程。
红帽RHCE培训记录(一)
最近在准备RHCE认证考试,这是培训时候的记录
GraspNet-1Billion: A Large-Scale Benchmark for General Object Grasping
摘要
物体抓取对于许多应用来说都是至关重要的,这也是一个具有挑战性的计算机视觉问题。然而,对于杂乱的场景,目前的研究存在着训练数据不足、缺乏评价基准的问题。本文中我们提供了一个具有统一评价系统的大规模抓取姿态检测数据集。我们的数据集包含97280张RGB-D图像,包含超过10亿个抓取姿势。同时,我们的评价系统通过解析计算直接反映抓取是否成功,可以对任何一种抓取姿态进行评价,而不需要完全标注ground-truth。此外,我们提出了一个端到端的给定点云输入的抓取位姿预测网络,其中我们以解耦的方式学习接近方向和操作参数。设计了一种新的抓取,提高了抓取的鲁棒性。我们进行了大量的实验,表明我们的数据集和评估系统可以很好地与现实世界的实验匹配,我们提出的网络达到了最先进的性能。我们的数据集、源代码和模型已在www.graspnet.net开源。
简介
对象抓取是一个基本问题,在工业、农业和服务贸易中有着广泛的应用。抓取的关键是在给定的视觉输入(图像或点云)下检测抓取姿态,这已经引起了计算机视觉界的广泛关注。
虽然对象抓取很重要,但目前有两大障碍阻碍了这一领域的发展。首先,抓取姿态有不同的表示形式 ...
将emacs打造成编程神器
已放弃自己配置,现已全面拥抱doom emacs。
emacs 操作
光标移动
下面的C指键盘的Ctrl键,M指键盘的Alt键, <RET>指回车键,DEL指退格键
下一行:C-n
上一行:C-p
下一个字符:C-f
前一个字符:C-b
下一个词:M-f
上一个词:M-b
将光标所在行至于屏幕中间:C-l
向下滚动一屏:C-v
向上滚动一屏:M-v
光标置于行首:C-a
光标置于行尾:C-e
光标置于行首的第一个字符: M-m
光标置于段首:M-a
光标置于段㞑:M-e
M-<移动光标到最前端
M->移动光标到最末端
移动光标到指定行:M-g M-g 行号
复制、移除、召回、删除、撤销
emacs里面的剪切称为“移除”,粘贴称为“召回(yanking)”
移除:C-w
复制:M-w
召回:C-y
C-d删除光标后的一个字符
M-d删除光标后的一个单词
C-k移除从光标到行尾的字符
M-k移除从光标到句尾的字符
使用curx包,C-c k删除当前行
使用hungry-delete包,C-c DEL向前删除多行空白,C-c d向后删除多行空白
选中一个区域删除:
...
java/c++/rust对象复制之间的区别
对比了下Java, C++, rust三种编程语言在对象复制过程中的区别。
CV学习系列:SIFT
没有数据集,深度学习说,这事我干不了。试试SIFT等手工特征吧。
CNN学习系列:数据集和性能指标
数据集划分:
含义:
数据划分:训练 / 验证 / 测试集
训练集:用训练集对算法或模型进行训练;
验证集:利用验证集进行交叉验证,即评估几种算法或模型中哪一个最好,从而选择出最好的模型;
测试集:最后利用测试集对模型进行测试,获取模型运行的无偏估计。
在VOC数据集中,包含4种数据文件,train、test、val、trainval
train.txt:用于训练的图片数据名称;
test.txt:用于测试的图片数据名称;
val.txt:用于验证的图片数据名称;
trainval.txt:train+val数据集和。
划分:
在小数据量的时代,如 100、1000、10000 的数据量大小,可以将数据集按照以下比例进行划分:
无验证集的情况:70% / 30%;
有验证集的情况:60% / 20% / 20%;
数据集格式
训练时常用的数据集格式有
VOC
COCO
标准的VOC数据格式如下:
VOC2007/
Annotations/
000000.xml
000001.xml
…
ImageSets/
Main/
train.txt
test.txt
val ...
CNN学习系列:RCNN理论基础
经历了骨干网络的初步学习之后,逐渐进入目标检测领域。
目标检测算法发展史(陆峰,基于深度学习的目标检测技术综述[doi: 10.15888/j.cnki.csa.007839])
基于深度 学习的目标检测算法大致可分为基于候选区域和基于回归两大类. 基于候选区域的目标检测算法精度高, 但是结构 复杂, 检测速度较慢. 而基于回归的目标检测算法结构简单、检测速度快, 在实时目标检测领域有较高的应用价值, 然而检测精度相对略低。
RCNN作为two-stage检测算法的代表,开始RCNN的学习。
论文:rich feature hierarchies for accurate object detection and semantic segmentation
*RCNN(Regions with CNN features)*过程
预训练一个CNN
将selective search预选出的2000个候选框resize,作为model输入CNN
model前向运算至pool5,抽取这一层的特征值
训练SVM,进行二分类问题
Bounding box regression,根据监 ...
python使用中遇到的问题总结
python中的元类
请参考博文深刻理解Python中的元类(metaclass)
12a = 10print(a.__class__)
这里,10是一个对象,通过a.__class__就可以找到创建该对象的类,结果是<class 'int'>
同理
12s = "abc"print(s.__class__)
结果为<class 'str'>
自定义类
1234567class Person: passp = Person()print(p.__class__)
结果为<class '__main__.Person'>
那么,根据“类也是对象”这句话,int这个类对象,是谁来创建的呢?
1print(int.__class__) # 或者print(a.__class__.__class__)
结果为<class 'type'>
同理
1234567class Person: passp = Person()print(Person.__class__) # 或者print(p.__class__.__cl ...