动态链接库的使用有两种方式,一种是在编译的时候就把动态链接库的头文件包含起来,链接的时候,系统自动去查找需要的动态链接库;另一种是程序动态的去加载,windows下是使用LoadLibrary加载库文件,然后通过GetProcAddress获取函数指针;在linux下是使用dlopen加载库文件,然后通过dlsym获取函数指针。但是动态加载的方式,需要在调用的地方定义很多函数指针,使用起来不太方便,而且动态链接库改了接口,使用的地方也需要相应的修改。有没有更好的方法呢?当然有,可以利用可变参数模板来改善动态加载链接库的使用。 windows […]
GoF中的观察者模式,是设计中经常使用的模式。 #include<list> class Subject; class Observer { public: virtual ~Observer(); virtual void Update(Subject* changedSubject) = 0; protected: Observer(); }; class Subject { public: virtual ~Subject(); virtual void Attach(Observer *); virtual void Detach( […]
在cuda基本编程步骤这一篇文章中,可以看到cuda编程中需要在两个地方分配内存(主机和设备之间),还需要手动拷贝数据,这样使用起来非常的不方便。从cuda 6.0开始,提供了统一内存的模式,可以方便cuda的编程。要利用统一内存模式,需要SM的架构大于3.0,而且操作系统必须时64位的。 在统一内存模式中,内存分配的方式是: int *value; cudaMallocManaged(&value, sizeof(int)); 还可以结合std中的allocator进行高效的内存分配: #include <cstdio> #include <cstddef> […]
CUDA编程的基本步骤: 1. 编写Kernel函数 2. 为主机和设备需要使用的数据分配内存 3. 拷贝主机内存的数据到设备内存 4. 调用kernel函数执行计算 5. 把计算后的数据结果从设备内存拷贝回主机内存 6. 释放为主机和设备分配的内存 举一个最简单的例子: #include <stdio.h> #include <cuda_runtime.h> #include “helper_cuda.h” //声明一个kernel 函数 __global__ void vectprAdd(const float *A, const float *B, […]
面向对象编程,类设计的好坏,对程序非常重要。类设计的合理,以后修改程序和扩展程序的功能有很大的帮助。遵守下面几个原则,有利于设计出合理的类。 1. 单一职责原则(Single Responsibility Principle) 每个类应该只有一个职责(A class should only have a Single responsibility),如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。 假设有一个报表类,现在有两个方法,一个显示报表,一个保存报表。 cl […]
如何才能设计出一个使用方便,不容易出错的类,下面的问题能帮助我们在设计类的时候,考虑的更加全面一些。 1. 类需要一个构造函数吗? 2. 数据成员是私有的吗? 3. 类需要一个无参的构造函数吗? 4. 是不是每个构造函数初始化所有的数据成员? 5. 类需要析构函数吗? 6. 类需要一个虚析构函数吗? 7. 类需要复制构造函数吗? 8. 类需要一个赋值操作符吗? 9. 赋值操作父能正确将对象赋给对象本省吗? 10. 类需要定义关系操作符吗? 11. 删除数组时记住用了delete[ ]吗? 12. 复制购置函数和赋值操作符的参数类型中加了const吗? 13. 如果函数有应用参数,它们应该是co […]