看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
james732:其實我也有想到這件事,不過懶得補充了 XDDD 11/23 02:22
softwind:說到member的宣告順序 XXD C++ primer上面有個sample 11/23 02:25
softwind:說明 member宣告順序 就是 初始化順序... 11/23 02:26
loveme00835:Inside The C++ Object Model 3.2 Data Member Layout 11/23 02:28
loveflames:static const literal type最早初始吧?即使較晚宣告 11/23 06:34
holymars:其實重要的是POD type和non-POD type的差別 11/23 13:10
holymars:non-POD type的memory layout有一部份是implementation 11/23 13:11
holymars:define的.. 11/23 13:11
loveflames:有時會覺得很難確定是否implementation-defined 11/23 13:23
loveflames:因為spec有時一句話就帶過,沒仔細看還找不到 11/23 13:23
loveme00835:你需要把它都 hightlight 起來 XD 11/23 13:26