Fortran Coder

查看: 29243|回复: 10
打印 上一主题 下一主题

[指针] 关于fortran里指针的讨论

[复制链接]

12

帖子

2

主题

0

精华

入门

F 币
82 元
贡献
43 点
跳转到指定楼层
楼主
发表于 2014-2-20 00:58:30 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 btx97 于 2014-2-20 15:53 编辑

因为听说高手都是指针用的比较多的,所以最近在考虑fortran里指针的作用。特意发帖希望高手们能来一起讨论下,让我们学习中的新人长点知识。:lol:lol
在fortran 95/2003 for scientists and engineerings 书中指出,在数组交换的过程中,用指针交换的效率明显比用普通变量交换的效率要高。 所以自己写代码比较了一下效率,代码为
[Fortran] 纯文本查看 复制代码
program test_pointer
  implicit none
  real, dimension(100,100), target :: array1, array2
  real, dimension(:,:), pointer :: p1, p2, temp_p
  real, dimension(100,100) :: a1, a2, temp

  integer :: i
  real :: begin, end

  call random_number(a1)
  call random_number(a2)

  array1=a1
  array2=a2

  p1=>array1
  p2=>array2
  call cpu_time(begin) 
  do i=1,1000000
     temp=a1
     a1=a2
     a2=temp
  end do
  call cpu_time(end)
     
  write(*,*) 'Time of variable exchange:', end-begin

  call cpu_time(begin)
  do i=1,1000000
     temp_p=>p1
     p1=>p2
     p2=>temp_p
  end do
  call cpu_time(end)

  write(*,*) 'Time of pointer exchange:', end-begin

end program test_pointer

运行结果为:

[Shell] 纯文本查看 复制代码
$ ./a.out 
 Time of variable exchange:   4.5159998    
 Time of pointer exchange:  8.00037384E-03




可以发现用指针的确比用普通变量有效。
不过我还有个疑问希望高手能解答下。 fortran中指针所占内存的是不是比它的Target要少很多?  因为如果fortran中指针所占内存跟它的Target一样,那么虽然代码效率是提高了,但所耗资源也提高了不少,就不见得很经济。 

此外,指针在链表里的应用很多书上都讲了。我觉得我们可以先不考虑指针在结构数据的应用。

十分希望各位高手能把自己使用指针的经验体会拿出来分享下, 共同讨论下fortran中指针的优缺点。



分享到:  微信微信
收藏收藏2 点赞点赞 点踩点踩

12

帖子

2

主题

0

精华

入门

F 币
82 元
贡献
43 点
沙发
 楼主| 发表于 2014-2-20 16:12:20 | 显示全部楼层
chuxf 发表于 2014-2-20 09:49
Fortran 的指针具有特殊性。一般来说,所占的内存比它的Target要少很多很多。

if 指向单变量或结构体 then ...

谢谢讲解,又增长了点知识。

这样看来用指针指向大型数组是比较划算的:lol。 

单个变量是不是就不怎么样了,因为一个real好像也是4字节吧。 

另外也谢谢jason388和fcode能说出自己对指针的理解。

12

帖子

2

主题

0

精华

入门

F 币
82 元
贡献
43 点
板凳
 楼主| 发表于 2014-2-21 16:33:26 | 显示全部楼层
本帖最后由 btx97 于 2014-2-21 16:37 编辑
delta 发表于 2014-2-21 10:08
膜拜各位大虾

Fortran还不支持指针数组,不然在数值计算中也可以经常用用的 ...

c 语言有指针数组和数组指针的区别,但fotran里好像没有这样的区别吧。

我的例子程序中p1指向了一个数组,这是数组指针的概念的吧。
但p1本身也是个数组,p1(i,j)可以取出所对应的变量值,这个是指针数组的概念吧。

c语言里可以移动一个指针到指定内存单元,如p+1。fortran里好像没这个功能。
而且fortran里也不能拿单个(非数组)指针去指向一个数组。
我哪说错了,你们随便指正哈。学习中,有人指出错误很重要。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-14 20:26

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表