悲催的科学匠人 - 冷水's blog

C++中实现动态多维数组模板的分析-02

我希望,一个多维数组模板类可以做到以下几点:

  1. 轻易的实现多维数组动态构造,无需使用者人工对多维指针进行设置,比如只需要一个对象定义就搞定。
  2. 如同FORTRAN一样,对各维的范围没有限制,如从-20到13这样的范围。C/C++是非得从0开始,这在很多时候是不方便的。
  3. 对维数没有限制,或者限制小。FORTRAN似乎支持最高到7维数组,我认为这个限制是不合适的,应该突破。
  4. 可以类似对数组阵列的形状(包括维数和各维尺寸)进行改变,比如开始定义为20X30,使用中可以调整为30X20或者6000或者10X6X100。
  5. 既可以通过多维指标来访问(如[i,j,k]),又可以通过一维化指标访问(如[n]),这在很多时候也是很有用的,至少循环的时候可以只用一层for语句。
  6. 支持多种数据类型,这个通过模板容易实现。
  7. ……还没想好,以后再补充

C++中实现动态多维数组模板的分析-01

C++原生多维数组与FORTRAN原生数组功能差远了。不明白为什么不在标准中把多维数组加强一些,本来这也不是什么难事。如果说用stl::vector可以实现就不做了,那也太差强人意了。boost::multiarray采用了一些高级技术,使得访问方式和原生数组一致。但是性能不佳,比原生数组性能第一个量级,完全无法接收。

在早期的FORTRAN中,动态多维数组采取一维化分配,然后映射为多维数组。一些C编写的数值计算程序也采取类似的方法。这样做能够保证性能,但是C中使用起来不方便。

我希望依然沿用一维化方式,但是采用C++封装内部的映射和指标转化算法,使得使用简便。我不追求与原生数组一致的[]访问方式,因为这样会为了表观的完美而引入复杂的机制,而本末倒置的降低性能。

 

 

处女贴

选择这里是因为这里支持latex,其次这里是纯粹技术迷的小天地。不过有点担忧,这里能够有多长久。

 

我是研究科学与工程计算的,特别是CFD,希望开发一些有关大规模计算的基础库。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee