2012-03-16 109 views
1

我有一個簡單的問題。在函數之間跳轉或將函數中的值傳遞給函數通常更好?更好地跳轉功能或將功能值傳遞給功能? C

例如,在我目前正在使用的結構中,結構game_structure作爲包含所有數據的結構,是否最好在函數之間傳遞新的game_structures,或者使用函數或多或少作爲循環?目前,例如,我稱通過庫存命令循環的功能inventory(game_structure *gs)。但是,完成後,它會啓動功能game_loop(game_structure *gs);,然後返回遊戲。如果我讓inventory(game_structure *gs)返回game_structure在其他地方被調用,會更好嗎?

但即使在其他情況下,什麼更有利?在循環之間跳轉,還是返回值?

+1

最好寫簡單容易的維護,而不是不可能擴展代碼。除非出於更緊迫的原因不能這樣做。 (我還沒有找到任何*我的*工作。) – 2012-03-16 03:49:03

+0

我認爲創建某種靜態數據結構可能不是一個壞主意,非本地跳轉破壞堆棧(不是真的,但..)。 – AoeAoe 2012-03-16 04:26:57

回答

1

我認爲如果程序流程是以程序化方式構建的話(如果可能的話),它有助於可維護性。因此,當調用者不關心被調用函數的結果時,在函數結尾處調用另一個函數會使事情不必要地複雜化。在我的代碼中,我儘量減少不必要的調用嵌套和遞歸。當涉及到維護代碼時,它會讓你的生活更簡單。

0

這實際上取決於你在做什麼以及你正在使用哪種編程語言。

在C中,我會錯誤地重複使用該結構,並避免做太多遞歸的東西(以避免吹出堆棧)。畢竟,編寫嚴格的代碼和使用小內存是現今C語言的重點,而mallocinc的東西實際上也很煩人。另一方面,如果我在Haskell中編程,我會在不可變的數據結構和大量的遞歸/尾遞歸方面犯錯。

0

這是一個堆棧大小與對象複製的問題,我相信。

對於C,特別是傳遞值或引用其他函數。這不僅保持了邏輯,而且幾乎在所有情況下都是正確的選擇。

如果您在return語句中調用另一個函數,則原始堆棧不會被銷燬,並且會創建新函數的新堆棧。這樣做時,在函數跳轉期間,對象將被複制或移動到新堆棧進行操作。儘管依賴於編譯器,但不能保證被「移動」,從而使其與按值傳遞對象到函數以及溢出堆棧的可能性相同。

如果您真的關心多次大對象複製,一種更好的做法是將該對象聲明爲其生命範圍內的全局靜態對象。在調用函數時,傳遞對象的引用。儘管有一個問題。您在訪問內存時需要格外小心,因爲數據可能會無意中更改。