Re: [問題] C++ 是否真有結構體存在?

看板C_and_CPP (C/C++)作者 ( )時間15年前 (2010/11/23 02:04), 編輯推噓5(506)
留言11則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《james732 (好人超)》之銘言: : 事實上,在C++裡的 : class OO { : public: : int member1, member2; : }; : 與C語言裡的 : struct SS { : int member1, member2; : }; : 它們在電腦的記憶體裡的樣子,其實是一模一樣的 : 雖然我們看程式碼,會覺得它們好像是不同的東西 : 但是對電腦來說,這根本就沒有差別 : 所以,如果你認為C語言裡,這個東西叫做結構體: : struct SS { : int member1, member2; : }; : 那其實沒道理說這個東西就不是結構體: : class OO { : public: : int member1, member2; : }; 這裡有個無聊的八卦,之前其實也有講過,但我忘記我回在哪篇 XD Inside the C++ Object Model 也有講這件事。 那就是... class ExampleA { public: int member1; int member2; }; 跟 class ExampleB { public: int member1; private: int member2; }; 實際上只有 ExampleA 可以跟 C 的 struct 相容。 因為編譯器可以把 ExampleB 裡的 private 區段擺在 public 區段之前。 只有保證同一區段內的資料是照你寫的順序擺。 我平常都是統一放 private,所以其實對我沒什麼影響。 PC 和工作站用的編譯器目前應該是還沒有真的會改順序的, 嵌入式系統用的編譯器我就不曉得了。 有些小架構比較怕東怕西,想榨空間和效能,可能會有相關的最佳化被實作。 感覺跟 cache 有關的最佳化也可以在這下手,做下去不知道能不能發 paper XD 是聽說過有些地方的研究著重在 data layout 上... -- Ling-hua Tseng (uranus@tinlans.org) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: http://www.tinlans.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.106.161 ※ 編輯: tinlans 來自: 118.160.106.161 (11/23 02:06)

11/23 02:22, , 1F
其實我也有想到這件事,不過懶得補充了 XDDD
11/23 02:22, 1F

11/23 02:25, , 2F
說到member的宣告順序 XXD C++ primer上面有個sample
11/23 02:25, 2F

11/23 02:26, , 3F
說明 member宣告順序 就是 初始化順序...
11/23 02:26, 3F

11/23 02:28, , 4F
Inside The C++ Object Model 3.2 Data Member Layout
11/23 02:28, 4F

11/23 06:34, , 5F
static const literal type最早初始吧?即使較晚宣告
11/23 06:34, 5F

11/23 13:10, , 6F
其實重要的是POD type和non-POD type的差別
11/23 13:10, 6F

11/23 13:11, , 7F
non-POD type的memory layout有一部份是implementation
11/23 13:11, 7F

11/23 13:11, , 8F
define的..
11/23 13:11, 8F

11/23 13:23, , 9F
有時會覺得很難確定是否implementation-defined
11/23 13:23, 9F

11/23 13:23, , 10F
因為spec有時一句話就帶過,沒仔細看還找不到
11/23 13:23, 10F

11/23 13:26, , 11F
你需要把它都 hightlight 起來 XD
11/23 13:26, 11F
文章代碼(AID): #1Cwh2RVF (C_and_CPP)
文章代碼(AID): #1Cwh2RVF (C_and_CPP)