回答
有幾個其他的答案,這或許略微解決不同(但相關)的要點。在這裏我會試着調和它們。
Vladimir F's answer着眼於所謂的拷入/拷出機制; bfletch's answer對論點的最終影響。
一般而言,以下
integer i(2,2)
i=0
call dosomething(i(1,:)) ! Just to make it not contiguous.
contains
subroutine dosomething(j)
integer j(2) ! or j(*), or j(:)
j=1
end subroutine
end program
的效果是,該陣列具有i
設置爲1
一些元件和其他0
。所以,是的:無論是否存在臨時副本(來自一個答案),在調用之後可以觀察到的是,它是修改後的實際參數本身。
當然,還有一個例外:value
屬性。 如果上述子程序,而不是像
subroutine doseomthing(j)
integer, value :: j(2)
j=1
end subroutine
那麼確實是有爭論的真實副本。對虛擬參數j
的修改不會反映在i
部分的實際參數中。
這是當前的Fortran。 Fortran 90作爲標記,沒有此功能。
現在看來,你可能更好地閱讀OP的實際意圖。問題在於標題是「它是否在內存中創建副本」,但最後的問題是原始內容是否被修改。 –
我只是剛剛注意到這是一個自我回答的問題,但即使在這種情況下,說臨時副本也是非常有價值的。可能我還可以補充一點:關於創建副本的切片沒有任何意義,在這裏我們只關注切片作爲參數的情況。陣列片分配也可能需要臨時副本。 – francescalus
這取決於如果a
本身是連續的,並且some_subroutine
看起來如何。
你大概默默地認爲a
是連續的,但它不一定是,如果a
本身是一些作爲假設形狀數組或數組指針傳遞的切片。
即使a
是不連續的,並因此也a(:,1)
沒有,將不會如果some_subroutine
接受一個假定外形的參數需要一個拷貝
subroutine some_sub(b)
real :: some_sub(:)
- 1. 在C#中用現有數組構建一個數組 - 這會在內存中創建副本嗎?
- 2. C#數組切片無副本
- 3. 創建副本在Linux中
- 4. 在iPhone中創建數據庫副本
- 5. 在PostgreSQL中創建數據庫副本
- 6. 是否存在無法創建深層副本的對象?
- 7. 在PS中切片設計是否會創建錯誤代碼?
- 8. 在PHP中切片數組
- 9. 在Android中爲Array創建一個數組副本?
- 10. ConcurrentHashMap是否自己創建副本?
- 11. 此作業是否創建副本?
- 12. Java foreach是否創建副本?
- 13. QVector :: replace()是否創建深層副本?
- 14. 創建整數數組的副本
- 15. SqlCommand.Clone()是否創建深層副本或淺層副本?
- 16. 在內存中運行MongoDB是否會在內存上創建重複內容
- 17. 在AS3中創建現有動畫片段的副本
- 18. 輔助索引是否會在cassandra中創建另一個數據副本?
- 19. find_or_create_by_name_and_location在Rails中創建ActiveRecord副本
- 20. 比較器在TreeMap中創建副本
- 21. 在切片中組塊切片
- 22. 在LiveCharts中創建餅圖切片
- 23. 如何在Fortran中創建函數?
- 24. 如何在java中創建數組而不是引用的副本?
- 25. HashSet是否創建添加對象的內部副本?
- 26. 在c函數中創建和訪問fortran動態數組
- 27. 如何創建數組的副本?
- 28. 切片操作是否提供深度或淺度副本?
- 29. 是否[:]切片只能製作列表的淺表副本?
- 30. 如何在FORTRAN例程內爲結構/數組創建句柄?
對於gfortran,選項「-Warray-temporaries」或「-fcheck-array-temporaries」可用於獲取有關臨時對象的一些信息。另外,你可以打印實際數組和虛擬數組的第一個元素的地址,以檢查它們是否指向相同的內存(例如,使用c_loc()或loc())。 – roygvib