簡體   English   中英

C vs C ++ struct alignment

[英]C vs C++ struct alignment

我在最近的一次采訪中被問到有關C ++結構字段對齊的問題,並且理論上C和C ++在結構打包中遵循相同的策略。

Hovewer,這是錯誤的假設。 采訪者說,一般來說,C和C ++以不同的方式包裝結構,我們永遠不應該期待相反的結果。 恕我直言,這是一個奇怪的聲明。 C ++中的結構沒有pack "C"限定符,可用於雙語C / C ++頭文件。

因此在實踐中,它可能意味着您無法在C ++中創建結構並將其傳遞給C庫,因為通常它的字段將以不同的方式對齊並具有不同的偏移量。 但實際上,大多數程序員都非常依賴這種互操作性,直到他們將一個指向C POD結構的指針轉換為對這個結構的C ++包裝器的引用,並使用了一些輔助方法。 你能澄清一下這個問題嗎?

C和C ++語言標准都沒有對struct padding的要求,並將其作為編譯器實現細節。 對此的嚴格解釋意味着無法保證兩者之間的結構相同。

然而,在實踐中,如果需要,能夠同時使用C和C ++(例如GCC或Clang)的工具鏈的給定版本可以以相同的方式打包相同的結構。 如果沒有這個,世界上許多生產代碼根本就行不通。 然而,這是工具鏈給出的保證,而不是語言。

值得注意的是,如果你要聲明一個與C原始類似的結構,但添加了訪問說明符( privatepublicprotected ),那么布局會發生變化,但由於結構不再相同,這有點延伸。

這顯然是錯誤的(在面試官方面)。 很明顯,對於任何使用任何處理結構的低級API的人來說,結構打包與C和C ++是相同的 - 例如,網絡API。 所有這些都是C函數,它接受'C'結構,但它們從C ++代碼中被安全地稱為數百萬次。

你應該很幸運,你有這個問題。 它清楚地表明你不應該在那里工作。

當開發C ++時,開發人員發現C程序員依賴於C ++開發人員不想保證的一些東西,但不保證他們會意味着許多C代碼也是有效的C ++代碼在使用時會被破壞作為C ++代碼。 不可取。

這就是他們發明“POD”結構的原因:沒有使用任何C ++特性的結構將在C ++程序中完全像在C程序中那樣運行(除了實現定義的行為可能會改變的事實,因為C編譯器和一個C ++編譯器顯然不是相同的實現。另一方面,C ++編譯器可能只是從C編譯器復制實現定義)。

如果你采用任何普通的C結構也是一個有效的C ++結構(例如,沒有名為“class”的成員),那么你只需在開始大括號之后添加“public:”,然后將其布局,成員順序,對齊等等都可以改變。 即使所有結構成員都默認是公共的,所以沒有什么真正改變。 除了因為“公共:”,它不再是POD了。

暫無
暫無

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

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