我在最近一次關於C++結構體字段對齊的問題中被問到過,並且理論上C和C++遵循相同的結構打包策略。C vs C++結構對齊
Hovewer,這是錯誤的假設。面試官說,總的來說,C和C++以不同的方式打包結構,我們不應該期待相反的結果。恕我直言,這是奇怪的聲明。對於在C++中用於雙語C/C++頭文件的結構,沒有pack "C"
限定符。
因此實際上可能意味着您不能在C++中創建結構並將其傳遞到C庫,因爲通常它的字段將以不同方式對齊並具有不同的偏移量。但事實上,大多數程序員在將指針轉換爲C結構體時,嚴重依賴於這種互操作性,以便用一些輔助方法來引用C++包裝器。你能否澄清這件事?
多麼奇怪的問題。如果C和C++之間的結構填充不同,我會被擰緊。也許面試官在一些晦澀難懂的編譯器中發現了一些非常奇怪的問題 - 或者他正在考慮C和C++編譯器如何可能完全不同,並且期望兩個編譯器以相同填充方式以相同方式對齊字段可能不是我們應該做的事情有信心依賴(但是即使在兩個C編譯器或兩個C++編譯器之間也是如此 - 與語言無關)。 –
你是對的。包裝是一個處理器實現細節,它確保了對齊規則的遵守。針對相同處理器的C編譯器和C++編譯器必須處理相同的實現細節。 –
結構對齊取決於編譯器級別,取決於處理器體系結構。由於ABI要求,編譯器最喜歡在一個套件(GCC,Clang/LLVM)中具有兼容的對齊,但彼此之間可能有不同的規則。 – myaut