随笔分类 - C++学习
摘要:c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。 左值、右值 C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值,而右值不具名。
阅读全文
摘要:一、背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名。 最近在写c++代码的时候,有实现一个模板类,说实话,虽然用c++用了好多年了,但还真没花多少时间去研究模板,因为我始终觉得
阅读全文
摘要:提出问题: 如果有这样一个模板: 对于以下若干种定义方式,哪些是对的(通过编译)? 为了不影响大家分析判断,我把答案颜色调成比较浅的颜色,下面即是答案: 问题解答: 首先,说明一下三个正确的答案。 第一种形式称之为特化定义,其作用是为模板某一特化提供其静态成员的定义,在我们例子中,它仅仅为Test<
阅读全文
摘要:在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的
阅读全文
摘要:在C++的类中有些成员变量初始化和一般数据类型的成员变量有所不同。以下测试编译环境为: 测试代码(g++编译通过): 这些特殊类型的成员变量主要有: 对于==1. 引用==和==2. 常量==,成员变量必须通过构造函数的==参数列表==的方式初始化。例如:上述程序中的r 和 d 变量的初始化。 对于
阅读全文
摘要:总结一下map::erase的正确用法。 首先看一下在循环中使用vector::erase时我习惯的用法: 程序从一个vector中删除值为0的元素,利用了vector::erase函数根据iterator删除某个元素时会返回下一个元素的iterator的性质: http://www.cpluspl
阅读全文
摘要:说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解。 (1)并行区域数量的确定: 在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢? OpenMP的遇到parallel指令后创
阅读全文
摘要:conv_xxx.hpp class convolution { ... ... typedef std::map ConvDtMap; static ConvDtMap conv_dt_map; static ConvDtMap CreateDtMap() { ...
阅读全文
摘要:背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。 参数详解
阅读全文
摘要:1. madvise的简介 madvise可以设置内存的分配方式或者说是分配的细节方式。具体参见linux man madvise。 #include <sys/types.h> #include <sys/mman.h> int madvise(caddr_t addr, size_t len,
阅读全文
摘要:写在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是,内容大多雷同且不全面。面对这一局面,在下在整合各种资源及融入个人理解的基础上,整理出一篇较为全面/详尽的文章,以飨读者。 正文: Ⅰ.举例 例1 结果: Ⅱ.参数 一般地,赋值运算符重载函数
阅读全文
摘要:1. 旧版enum存在的问题 1.1 问题1:向整形的隐式转换 在开始这个问题之前,我们需要知道什么是整形提升 查看之前的博文:C\C++中的整形提升 在看完什么是整形提升之后,我们开始这个问题: 旧版enum其实并不具有非常完全的类型安全(当然它也体现了一定的类型安全:1.禁止不同枚举体之间的赋值
阅读全文
摘要:前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚
阅读全文
摘要:简介 这门课作为 ECE 中少有的跟计算机科学相关的课,自然是必上不可。不过无论是 OpenMP 还是 CUDA,对于平时极少接触并行编程的我来说,都是十分吃力的,第一次作业的 OpenMP 编程已经让意识到了个中的差别,当然,在单个核心的计算速度基本达到极致的现在,掌握并行编程可以算是程序员的基本
阅读全文
摘要:为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef
阅读全文
摘要:相对于C++ 11之前的随机数生成器来说,C++11的随机数生成器是复杂了很多。这是因为相对于之前的只需srand、rand这两函数即可获取随机数来说,C++11提供了太多的选择和东西。 随机数生成算法: 随机数生成算法有很多,C++11之前的C/C++只用了一种。C++11则提供下面三种可供选择:
阅读全文
摘要:0 定义 C99中新增加的用于修饰指针的关键字,用于表示该指针所指向的内存,只有通过该指针访问得到(如下ptr指向的内存单元只能通过ptr访问得到)。从而可以让编译器对代码进行优化,生成更有效率的汇编代码。 1 优化举例 举例1,如下代码(引自参考1),以及翻译成汇编之后的代码。 调用mulit_a
阅读全文
摘要:近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块。同时,虽然网上有这方面的内容,但是感觉还是没说清楚。这里记录下来做备用,同时也给广大 python with c/c++ 派留给方便。如果你觉得我写的不好,可以
阅读全文
摘要:当矩阵尺寸过大时,数据的大小将超过缓存的大小,这是容易出现满不命中现象。 将矩阵进行分块可以解决这个问题,以下是完整的矩阵乘法代码: 分析思路: 1. 矩阵分块前后的乘法计算总数恒定不变,分块前是n^3 。 2. 现将矩阵按mxm进行分块,整个矩阵被分成n^2/m^2 个子矩阵,乘法计算总是 (n^
阅读全文
摘要:串行代码优化可分为以下几个层次: 系统级别,应用级别,算法级别,函数级别,循环级别,语句级别,指令级别。 1.系统级别 1.1 网络速度,利用率及负载均衡 如果应用经常等待网络数据的传输和到达,那么就得考虑网络的速度和利用率,如果是集群还得考虑网络的负载均衡。 1.2 处理器利用率 找出处理器利用率
阅读全文