2013-07-08 124 views
2

什麼建議使用,傳遞一個結構作爲指針const傳遞一個常量指針到一個結構VS傳值

 

int doCalculations(const MyStruct* my_struct); 
 

或由值傳遞struct,如在,

 

int doCalculations(MyStruct my_struct); 
 

爲什麼?

在C++中,我記得在某個地方,當struct/Class有一個不平凡的構造函數時,應該使用傳遞引用const的地方。在C語言中,雖然沒有構造函數,但我想這將需要一些時間來製作struct的本地副本。

+0

這取決於你的函數將如何使用'struct'。如果它必須改變'struct'裏面的東西,你需要一個指針。否則傳遞'struct'本身更可取。 – Kninnug

+4

@Kninnug通過值傳遞使用不必要的堆棧數量。更常見的指導是你應該傳遞指向const的'const const MyStruct *' - 當sizeof(MyStruct)> x'爲某個小值'x' – simonc

+2

@simonc:我想你的意思是'指向const' ,而不是'const指針'... – a1ex07

回答

3

如果你打算修改你的結構,那麼你顯然必須通過指針來傳遞它。

如果你不打算修改你的結構,那麼通過傳遞指針來避免不必要的複製仍然是一般慣例。指針將佔用內存,但可以通過寄存器傳遞(因此根本不使用堆棧內存)。

按值傳遞結構體將幾乎總是在堆棧上覆制它。

兩個,你必須選擇的方案:

  • 如果您的結構可以通過外力進行修改(即,它具有volatile)字段,那麼你可能會希望通過指針傳遞,以總有最新的版本。
  • 如果你的結構可能會停止你的函數的執行過程中存在的(例如,另一個線程free s表示內存),那麼你顯然必須作出的一個副本(按值傳遞)。
+0

*如果你打算修改你的結構,那麼你顯然必須通過指針來傳遞它*和*如果你不打算修改你的結構,那麼通常傳遞指針來避免不必要的複製*我不瞭解這兩句話的區別。 – 0decimal0

+1

@PHI創始人一般實踐!=要求。但我已經澄清了一點。 –

+0

@SergeyL。你關於結構的最後一點是停止純理論存在嗎? – Pacerier

0

有兩個原因傳遞結構由值,不建議:

1)。將結構內容複製到新的 臨時變量所花費的時間量。 2)。將浪費的堆棧空間量,特別是在結構很大的情況下更是如此。

因此使用指針爲const是一個更可行的選擇。