C++运算符重载与返回值优化
今天遇到的是内存释放错误的问题。原因是没写拷贝构造函数,奇怪的是我之前也没写确实能正常工作的,今天深究了一下发现是编译器做了返回值优化。
问题背景
编译环境还是针对C6455 DSP,为了做一些简单的图像直方图的处理,并且尽可能不用模板类,我自己写了一个简单的类用来存放带长度信息的数组,并且可以做一些简单的运算。重载了减法运算符,从而可以对两个直方图求差。
具体问题
当类中有那种需要动态分配空间的成员的时候,要记得提醒自己重载拷贝构造函数和赋值运算符,这两者缺一不可。为了举个例子,我定义了下面这个CData类。
123456789101112131415161718class CData{private: int *m_pData; unsigned int m_nLen;public: CData(); CData(unsigned int nLen); /* There is no copy constructor at the very begining */ CData(const CData &data); ...
关于C/C++的include顺序问题
今天遇到了因为include顺序不同而编译结果不同的问题。归根结底还是自己写代码的习惯不好导致的。
编译环境
既然要写就多写点吧。最近又开始做TI的DSP C6455相关的开发了。之前的文章里有写到,TI提供有一个CSL库,但是比较老,输出的格式是COFF,而现在一般是ELF。如果做一些新的开发的话,建议重新编译CSL库,并选择输出为ELF格式。
C6000 DSP的编译工具链目前主要有7.4和8.3版本。8.0以上的版本不再支持C6455了,所以我目前用的CGT版本是7.4.24,7.4版本的应该都差不多,因为文档都是一样的。
问题简化
实际工程中包含大大小小的文件很多,头文件的include层层嵌套。所以我在这里为了说明关键问题,把我实际遇到的问题做了简化。整个工程包含三个文件main.cpp, CData.cpp和CData.hpp。源码如下:
123456789101112// main.cpp /* Scenario 1: it doesn't work */#include "csl_types.h"#include &quo ...
类脑计算论文泛读
上学期听了何毓辉老师的《类脑计算与器件》课程,本文也是对上学期上课内容的大体总结。
参考文献:
[1] Nature Communications 2017, Face classification using electronic synapses
[2] Nature 2015, Training andoperation of an integrated neuromorphic network based on metal-oxide memristors
[3] IEDM 2015, Experimental demonstration and tolerancing of a large-scale neural network (165,000 synapses), using phase-change memory as the synaptic weight element
[4] TNNLS 2015, Supervised Learning Using Spike-Timing-Dependent Plasticity of Memristive Synap ...
电磁感应、电感与变压器
Biot-Savart定律
Biot-Savart定律指出电流元IdlIdlIdl在与其距离为rrr的空间任意一点P处激发的磁感应强度B的大小为
dB=kIdlsinθr2dB = k{ {Idl\sin \theta } \over { {r^2} } }
dB=kr2Idlsinθ
图中dBdBdB的方向垂直于屏幕方向向内。公式中的k=μ04πk = { { {\mu _0} } \over {4\pi } }k=4πμ0,μ0\mu_0μ0是真空磁导率。磁感应强度B的方向满足右手螺旋定则。
载流直导线附近的磁场
计算一根通电长直导线附近一点的磁感应强度B。长直导线是由无数个电流元组成,积分即可。
在长直导线上建立坐标轴,与待求位置P水平的位置作为竖直方向的零点。直接积分,积分变量是lll,在有了坐标轴的情况下,我们就可以把这个曲线积分转化为定积分。
B=∫ldB=μ0I4π∫lsinθr2dl=μ0I4π∫−∞∞sinθr2dlB = \int\limits_l {dB} = { { {\mu _0}I} \over {4\pi } }\int ...
近期C6000 DSP开发小结
使用C++开发DSP
如果你也跟我一样刚开始接触C6000系列的DSP,我觉得可以尝试一下用C++来开发,虽然说这么做代码的执行效率可能会比C或者纯汇编的开发来得低,但它胜在能够让整个工程的脉络更加清晰。
面向C6000开发的cl6x编译器对C++有比较好的支持。上面三个文档就在编译器的安装路径下,一个是介绍COFF移植到EABI的注意点,另外两个一个是关于编译器的文档,一个是关于汇编工具的文档。本文中的部分内容主要也是参考上面的文档。
编译器支持的C标准是C89,支持的C++标准是C++98(而且有一些例外,本文中没有列出),支持的C++的主要特性有下面这些:
Complete C++ standard library support
Templates
Exceptions, which are enabled with the --exceptions option
Run-time type information (RTTI), which can be enabled with the --rtti compiler option
它虽然并不是完全支 ...
C11 & C++11运算符优先级
参考资料
The C++ Programming Language Section 10.3, Operator Summary
C11 Section 6.5, Expressions
C++11 Chapter 5, Expressions
适用于制作260×210的鼠标垫
高清原图, 分辨率:7800×6300,水平垂直分辨率:96dpi
FT-M6678开发(八)
82fdcffe56fbcc1dd2db551588416a33d54467b7340f2e7ac21428b5aac675e3386f8412c91cd2d22a980252157e819a12e15b6b7ae033dc8cce47b2e11a468b9f67087368679a8f4d3855f8ef233032b25af32848dfcf9d657e6241bedadc75f6bb57ca8d45f2c4a4a8edc5033a84bf93b5f5891844c24f5fc4a60e3fe049c4a296427c83a6d240670b9c44af8cc5f01cd9624417bd584731553a064ab801e09201e853504d62a4a7239aa72127d7058d5bdd16ccb7dc0169a1580a5ca8e620007cb2a53eb92b0cd57749baa33c462068969717bbcb9c07fb1ed08526a362e3d96ff750d55b494e2d67615a357f88c349589498fb327a2ad ...
FT-M6678开发(七)
82fdcffe56fbcc1dd2db551588416a33d54467b7340f2e7ac21428b5aac675e3386f8412c91cd2d22a980252157e819a12e15b6b7ae033dc8cce47b2e11a468b9f67087368679a8f4d3855f8ef233032b25af32848dfcf9d657e6241bedadc75f6bb57ca8d45f2c4a4a8edc5033a84bf93b5f5891844c24f5fc4a60e3fe049c4a296427c83a6d240670b9c44af8cc5f01cd9624417bd584731553a064ab801e09201e853504d62a4a7239aa72127d7058d5bdd16ccb7dc0169a1580a5ca8e620007cb2a53eb92b0cd57749baa33c462068969717bbcb9c07fb1ed08526a362e3d96ff750d55b494e2d67615a357f88c349589498fb327a2ad ...
FT-M6678开发(六)
82fdcffe56fbcc1dd2db551588416a33d54467b7340f2e7ac21428b5aac675e3386f8412c91cd2d22a980252157e819a12e15b6b7ae033dc8cce47b2e11a468b9f67087368679a8f4d3855f8ef233032b25af32848dfcf9d657e6241bedadc75f6bb57ca8d45f2c4a4a8edc5033a84bf93b5f5891844c24f5fc4a60e3fe049c4a296427c83a6d240670b9c44af8cc5f01cd9624417bd584731553a064ab801e09201e853504d62a4a7239aa72127d7058d5bdd16ccb7dc0169a1580a5ca8e620007cb2a53eb92b0cd57749baa33c462068969717bbcb9c07fb1ed08526a362e3d96ff750d55b494e2d67615a357f88c349589498fb327a2ad ...
FT-M6678开发(五)
82fdcffe56fbcc1dd2db551588416a33d54467b7340f2e7ac21428b5aac675e3386f8412c91cd2d22a980252157e819a12e15b6b7ae033dc8cce47b2e11a468b9f67087368679a8f4d3855f8ef233032b25af32848dfcf9d657e6241bedadc75f6bb57ca8d45f2c4a4a8edc5033a84bf93b5f5891844c24f5fc4a60e3fe049c4a296427c83a6d240670b9c44af8cc5f01cd9624417bd584731553a064ab801e09201e853504d62a4a7239aa72127d7058d5bdd16ccb7dc0169a1580a5ca8e620007cb2a53eb92b0cd57749baa33c462068969717bbcb9c07fb1ed08526a362e3d96ff750d55b494e2d67615a357f88c349589498fb327a2ad ...