`
暴风雪
  • 浏览: 388745 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论
文章列表
要获得GPU设备的数量,在cuda中是通过cudaGetDeviceCount(int*)来实现的。 对于每个GPU设备。cuda使用cudaDeviceProp类型来保存设备信息。cudaDeviceProp的详细内容如下   我们通过cudaGetDeviceProperties(cudaDeviceProp* prop,int i)来获取第i块设备属性。具体参考代码如下 #include<cuda_runtime.h> #include<windows.h> #include<iostream> using namespace std; ...
条款28:避免返回handles指向对象内部成分 先看代码 class data{ private: int a; public: int& getA(){ return a; } data(int n):a(n){} }; int main(){ data d(2); d.getA() = 1; cout<<d.getA()<<endl; return 0; }      理论上,作为私有变量a不应该在类外被修改,但是在这里,却通过getA成功 ...
条款26:尽可能延后变量定义式的出现时间     在使用某个变量之前再去定义这个变量,而不是很早就定义这个变量。这样做主要有两个好处。首先,程序员在阅读代码时可以立刻找到他的定义,而不是要翻阅代码寻找定义。也可以避免在前面定义了变量却在后面忘记使用的情况。另一个原因是可以节省资源。     另外书中提到了在循环中定义变量的问题。 for(int i = 0;i<10;i++){ num d(a); //使用d } num d; for(int i = 0;i<10;i++){ d = a;//使用d } ...
条款24:若所有参数皆需类型转换,请为此采用non-member函数     看下面这段代码 class num{ public: int data; num(int a):data(a){} num():data(0){} const num operator*(num a)const{ num res; res.data = this->data*a.data; return res; } };  当我们这样调用操作符的时候 num b = a*2;  编译是正确 ...
条款23:宁以non-member、non-friend替换member函数  一般我们相当然以为类中的成员函数更具封装性,而实际上并不是那么一回事,因为成员函数不仅可以访问private成员变量,也可以取用private函数、enums、typedefs等等。而非成员非友元函数能实现更大的封装性,因为它只能访问public函数。     将所有便利函数放在多个头文件内但隶属同一个命名空间,意味客户可以轻松扩展这一组便利函数。需要做的就是添加更多non-member non-friend函数到此命名空间内。     请记住:   宁可拿non-member non-friend函数替 ...
条款22:将成员变量声明为private     作为学生党,经常在代码里把变量声明为public,在外部直接进行访问了事。这个条款告诉我们,这样做是非常不科学的。     1,private能够提供非常完善的权限控制,你可以直接控制一个变量是只读,还是可读可写,甚至是只写。而不是把使用这个类的各种权限全部公开。     2,private对数据进行了封装,减少了数据被外界访问的机会,方便了代码的维护。 class base{ public: int data; char* name; };      试想有这样的一个类,其中的数据全部为public,那么 ...
条款21:当必须返回对象时,别妄想返回其reference     并不是在任何情况下都可以通过传引用的方式返回值。看下面这段代码 const Rational& operator* (const Rational& r1, const Rational& r2){ Rational temp; temp.numerator = r1.numerator * r2.numerator; temp.denominator = r1.denominator * r2.denominator; ...
条款20:宁以pass-by-reference-to-const替换pass-by-value     传递引用比起传递值的参数有一个明显的优势就是,传递引用并不会构造新的对象,从而避免了构造函数和析构函数的开销,提升函数效率。     传引用参数的时候,如果使用const引用,可以告诉接下来要使用函数的人,这个数据在函数中不会被改变。       pass-by-value还会造成对象切割的问题,下面一段代码 #include<iostream> #include<cstring> #include<cstring> using na ...
条款十八:让接口容易被正确使用,不易被误用     如果我们设计一个日期类,可能会写成如下的模样 class Date{ public: Date(int month, int day, int year); … };      这个构造函数貌似没有问题,但是她却无法阻止用户输入 ...
条款16:成对使用new和delete时要采取相同的形式     这个条款非常好理解。也就是说,当用new申请资源的时候,要用delete删除,当用new xxx = new XXX[]形式申请资源的时候,要用delete[]删除。     但有时候我们会写出下述的代码   typedef string AddressLines[4]; string *pal = new AddressLines;  当我们要删除数据的时候第一反应可能是delete而不是delete[]!所以说为了避免此类错误,应该尽量避免对数组进行typedef操作。     条款17:以独立语句将new ...
条款14:在资源管理类中小心copy行为      修改了一下书中代码(参考http://www.cnblogs.com/jerry19880126/archive/2013/05/25/3098997.html) #include<iostream> #include<cstring> #include<cstdio> #include<memory> using namespace std; class Lock { ...
条款13:以对象管理资源     这一个条款主要介绍了auto_ptr 和 shared_ptr。这是c++的两种智能指针类型。       对于一般在堆上分配的指针,我们需要在程序退出之前对其进行delete,否则就会造成内存泄漏。   base* ba = new base(); delete ba;      然而我们并不能保证每次都能正常的将生成在堆内的对象给删除,这时候就需要智能指针了。        智能指针的好处在于,每次程序退出时都会自动的将指向的对象删除,避免了内存泄漏。     智能指针的定义方法如下   auto_ptr&l ...
条款12:复制对象时勿忘其每一个成分       对于一个简单的类的拷贝函数,我们可以这样写 class base{ public: int data; base& operator=(const base& a){ this->data = a.data; return *this; } };     拷贝构造函数的情况和赋值拷贝情况类似。如果这时,我们要改变这个类,增加一个double b,但是没有修改赋值函数的话,进行赋值就会把新添加的变量遗漏掉!所以说,当对类进行修改之后,不要忘记更新 ...
条款11:在operator= 中处理自我赋值     一个包含指针变量的类,我们在为其写赋值函数(深复制)的时候可能会这样写   class base{ public: int data; double* p; base& operator=(const base& a){ this->data = a.data; ...
条款09:绝不在构造和析构过程中调用virtual函数     首先看下面一段代码,我们将在基类的构造函数中调用虚函数 #include<iostream> #include<cstring> #include<cstdio> using namespace std; class base{ public: base(){ fun(); } virtual void fun(){ cout<<"base class - fun\n"; } ...
Global site tag (gtag.js) - Google Analytics