簡體   English   中英

C結構賦值使用memcpy

[英]C structure assignment uses memcpy

我有這個StructType st = StructTypeSecondInstance->st; 它會產生段錯誤。 奇怪的是,堆棧回溯告訴我:

0x1067d2cc: memcpy + 0x10 (0, 10000, 1, 1097a69c, 11db0720, bfe821c0) + 310
0x103cfddc: some_function + 0x60 (0, bfe823d8, bfe82418, 10b09b10, 0, 0) +

那么,struct assigment是否使用memcpy

一個人說不出來。 小結構甚至可以保存在寄存器中。 是否使用memcpy是一個實現細節(它甚至不是實現定義的 ,或者未指定的 - 它只是編譯器編寫者選擇並且不需要記錄的東西。)

從C標准的角度來看,重要的是在分配之后,目標結構的struct成員比較等於源結構的相應成員。

我希望編譯器編寫者在速度和簡單性之間進行權衡,可能基於結構的大小,使用memcpy可能性越大。 一些memcpy實現是非常復雜的,並且使用不同的算法,這取決於長度是否為2的冪,或src和dst指針的對齊。 為什么要使用內聯版本的memcpy重新發明輪子或炸毀代碼?

可能,是的。

這應該不足為奇:結構賦值需要盡快將一堆字節從一個地方復制到另一個地方,這恰好是memcpy()應該擅長的事情。 如果你是編譯器編寫者,那么生成對它的調用似乎是不費吹灰之力的。

請注意,這意味着分配具有大量填充的結構可能效率低於最佳效果,因為memcpy()不能跳過填充。

該標准沒有說明編譯器實際如何實現賦值(或任何其他運算符)。 沒有什么能阻止編譯器(例如)為源文件中的每個操作生成函數調用。

編譯器有權按照它認為最好的方式實現賦值。 大多數情況下,對於大多數平台上的大多數編譯器,這意味着如果結構相當小,編譯器將生成內聯的移動指令序列; 如果結構很大,調用memcpy很常見。

然而,編譯器循環生成隨機位域並在其中一個與賦值源匹配時停止(讓我們稱之為算法bogocopy )是完全有效的。

如果您的目標是沒有可用(或完整)libc的平台,那么支持非托管操作的編譯器通常會為您提供關閉以發出此類libcall的開關。

這取決於編譯器和平台。 大對象的分配可以使用memcpy 但它絕不是segfault的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM