新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版用于讨论编程和软件设计的技巧
    [返回] 计算机科学论坛计算机技术与应用『 编程心得 』 → 高质量C++编程点滴(2) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 13539 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 高质量C++编程点滴(2) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 编程心得 』 的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 高质量C++编程点滴(2)

    使用合理的内存访问方式

      一、你需要开辟一段内存来存放和管理一个4 x 4的矩阵,并单位化之。

      不合理:


    int aMatrix[4][4];

    for ( int i = 0; i < 4; i++ )

    {

           for ( int j = 0; j < 4; j++ )

           {

                  if ( i == j )

                  {

                         aMatrix[i][j] = 1;

                  }

                  else

                  {

                         aMatrix [i][j] = 0;

                  }

           }

    }


      合理:


    int aMatrix[4 * 4];

    for ( int i = 0; i < 4; i++ )

    {

           for ( int j = 0; j < 4; j++ )

           {

    if ( i == j )

                  {

                         aMatrix[ i * 4 + j ] = 1;

                  }

                  else

                  {

                         aMatrix [ i * 4 + j ] = 0;

                  }

           }

    }


      解析:

      在任何时候都要避免使用多维数组,数组维数的增加,相应的程序复杂度将会以几何级数的方式增加,也更加的难于理解。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/10/11 10:22:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 编程心得 』 的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    二、你需要对上面那个矩阵赋值,使它从左上角向右下角按先纵后横的顺序给它赋值

      不合理:


    for( int i = 0; i < 4; i++ )

    {

           for ( int j = 0; j < 4; j++ )

           {

                  aMatrix[ j * 4 + i ] = i * 4 + j;

           }

    }

    合理:


    for( int i = 0; i < 4; i++ )

    {

           for ( int j = 0; j < 4; j++ )

           {

                  aMatrix[i * 4 + j ] = j * 4 + i;

           }

    }


      解析:

      尽量保证顺序的访问数组的每一个元素。由于Windows内存的管理模式,内存是分页管理的。顺序访问数组可
      以基本保证页面不会来回切换,从而减少了页失效的数量,提高了程序的整体性能。这种性能的提升对于大的数组尤为明显。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/10/11 10:24:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 编程心得 』 的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    三、你需要用3个float值来表示一个三维的点,并要写一个函数对一个三维点的数组进行计算赋值。

      不合理:


    void foo( float *pPoints[3] )

    {

           float aPoint[3] = { 1.0f, 2.0f, 3.0f };

           int nCount = (int)_msize( pPoints );

           for ( int i = 0; i < nCount; i++ )

           {

                  pPoints[i][0] = aPoint[0];

                  pPoints[i][1] = aPoint[1];

                  pPoints[i][2] = aPoint[2];

           }

    }

    合理:


    struct POINT3

    {

           float x, y, z;

    };

    void foo( POINT3 *pPoints, int nCount )

    {

           POINT3 Pt = { 1.0f, 2.0f, 3.0f };

           for ( int i = 0; i < nCount; i++ )

           {

                  pPoints[i] = Pt;

           }

    }


      解析:

      有两点,一,不要使用_msize对数组的大小进行测定,_msize只能对使用malloc或calloc申请的内存进行大小测定,
      对于其它的如new或一些API,将会导致程序的崩溃。在设计此类需要传入数组的函数时,别忘了把数组的元素数量也做
      为参数一并传入,哪怕它是固定的,这将是一个良好的习惯。二,对于float[3]这种类型,尽量避免直接使用它,
      最好的办法就是用struct对其进行简单的封装,在复制的时候直接使用“=”就可以进行准确的按位赋值了。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/10/11 10:25:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 编程心得 』 的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客4
    发贴心情 
    四、你有一个函数的定义,在这个函数中会new一个比较大的对象Data,并在计算后将它删除。但这个函数将被频繁调用。

      不合理:


    void foo( void )

    {

           Data *p = new Data;

    CalcData( p );

           delete p;

    }


      合理:


    char Buf[sizeof(DATA)];

    void foo( void )

    {

           Data *p = new(Buf) Data;

           CalcData( p );

    }


      解析:

      new(buf) type;是定位的new语法,它不会真正的分配内存,而是简单的在指定的已分配的内存起点上
      划分出一段与类型大小匹配的空间,并直接在这段内存上对该类型进行构造对象,并返回对象的指针。
      由于它没有真正的分配内存空间,因此它的效率是非常高的,在类似于上述例程中,频繁申请和释放一个
      大对象的操作,定位的new可以带来很大的效率提升。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/10/11 10:28:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 编程心得 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/13 3:00:45

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    8,232.422ms