作者tinlans ( )
看板C_and_CPP
標題Re: [問題] C++ 是否真有結構體存在?
時間Tue Nov 23 02:04:07 2010
※ 引述《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