導航:首頁 > 源碼編譯 > gcc82編譯器入口地址

gcc82編譯器入口地址

發布時間:2025-03-06 22:13:49

① 使用sizeof計算類的大小

類的sizeof大小一般是類中的所有成員的sizeof大小之和,這個就不用多說。
不過有兩點需要注意:1)當類中含有虛成員函數的時候,例如:
class B
{
float a;
public:
virtual void fun(void);
}
此時sizeof(B)的大小為8,而不是4。因為在類中隱藏了一個指針,該指針指向虛函數表,正因為如此,
使得C++能夠支持多態,即在運行時綁定函數的地址。
2)另一個要注意的是,當類中沒有任何成員變數,也沒有虛函數的時候,該類的大小是多少呢?
例如:
class B2
{
void fun(void);
}
此時sizeof(B2)的值是多少呢?在C++早期的編譯器中,這個值為0;然而當創建這樣的對象時,
它們與緊接著它們後面的對象有相同的地址。比如:
B2 b2;
int a;
那麼對象b2與變數a有相同的地址,這樣的話對對象b2地址的操作就會影響變數a。所以在現在大多數編譯器中,該值的大小為1。

如果有虛函數,則sizeof值為類的數據成員的大小加上VTBL(指針,4位元組),再加上其基類的數據成員的大小。如果是多重繼承,還得加上各基類的VTBL。

這個問題很麻煩.. 下面有更詳細的自己看下

http://rkfang.cnblogs.com/archive/2004/10/10/50599.aspx

② c#中內存對齊是怎麼回事

有虛函數的話就有虛表,虛表保存虛函數地址,一個地址佔用的長度根據編譯器不同有可能不同,vs裡面是8個位元組,在devc++裡面是4個位元組。類和結構體的對齊方式相同,有兩條規則1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行下面是我收集的關於內存對齊的一篇很好的文章:在最近的項目中,我們涉及到了「內存對齊」技術。對於大部分程序員來說,「內存對齊」對他們來說都應該是「透明的」。「內存對齊」應該是編譯器的 「管轄范圍」。編譯器為程序中的每個「數據單元」安排在適當的位置上。但是C語言的一個特點就是太靈活,太強大,它允許你干預「內存對齊」。如果你想了解更加底層的秘密,「內存對齊」對你就不應該再透明了。一、內存對齊的原因大部分的參考資料都是如是說的:1、平台原因(移植原因):不是所有的硬體平台都能訪問任意地址上的任意數據的;某些硬體平台只能在某些地址處取某些特定類型的數據,否則拋出硬體異常。2、性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。二、對齊規則每個特定平台上的編譯器都有自己的默認「對齊系數」(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的「對齊系數」。規則:1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。3、結合1、2顆推斷:當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。三、試驗我們通過一系列例子的詳細說明來證明這個規則吧!我試驗用的編譯器包括GCC 3.4.2和VC6.0的C編譯器,平台為Windows XP + Sp2。我們將用典型的struct對齊來說明。首先我們定義一個struct:#pragma pack(n) /* n = 1, 2, 4, 8, 16 */struct test_t { int a; char b; short c; char d;};#pragma pack(n)首先我們首先確認在試驗平台上的各個類型的size,經驗證兩個編譯器的輸出均為:sizeof(char) = 1sizeof(short) = 2sizeof(int) = 4我們的試驗過程如下:通過#pragma pack(n)改變「對齊系數」,然後察看sizeof(struct test_t)的值。1、1位元組對齊(#pragma pack(1))輸出結果:sizeof(struct test_t) = 8 [兩個編譯器輸出一致]分析過程:1) 成員數據對齊#pragma pack(1)struct test_t { int a; /* 長度4 < 1 按1對齊;起始offset=0 0%1=0;存放位置區間[0,3] */ char b; /* 長度1 = 1 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */ short c; /* 長度2 > 1 按1對齊;起始offset=5 5%1=0;存放位置區間[5,6] */ char d; /* 長度1 = 1 按1對齊;起始offset=7 7%1=0;存放位置區間[7] */};#pragma pack()成員總大小=82) 整體對齊整體對齊系數 = min((max(int,short,char), 1) = 1整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 8 /* 8%1=0 */ [注1]2、2位元組對齊(#pragma pack(2))輸出結果:sizeof(struct test_t) = 10 [兩個編譯器輸出一致]分析過程:1) 成員數據對齊#pragma pack(2)struct test_t { int a; /* 長度4 > 2 按2對齊;起始offset=0 0%2=0;存放位置區間[0,3] */ char b; /* 長度1 < 2 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */ short c; /* 長度2 = 2 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */ char d; /* 長度1 < 2 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */};#pragma pack()成員總大小=92) 整體對齊整體對齊系數 = min((max(int,short,char), 2) = 2整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 10 /* 10%2=0 */3、4位元組對齊(#pragma pack(4))輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]分析過程:1) 成員數據對齊#pragma pack(4)struct test_t { int a; /* 長度4 = 4 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */ char b; /* 長度1 < 4 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */ short c; /* 長度2 < 4 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */ char d; /* 長度1 < 4 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */};#pragma pack()成員總大小=92) 整體對齊整體對齊系數 = min((max(int,short,char), 4) = 4整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */4、8位元組對齊(#pragma pack(8))輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]分析過程:1) 成員數據對齊#pragma pack(8)struct test_t { int a; /* 長度4 < 8 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */ char b; /* 長度1 < 8 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */ short c; /* 長度2 < 8 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */ char d; /* 長度1 < 8 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */};#pragma pack()成員總大小=92) 整體對齊整體對齊系數 = min((max(int,short,char), 8) = 4整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */5、16位元組對齊(#pragma pack(16))輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]分析過程:1) 成員數據對齊#pragma pack(16)struct test_t { int a; /* 長度4 < 16 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */ char b; /* 長度1 < 16 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */ short c; /* 長度2 < 16 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */ char d; /* 長度1 < 16 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */};#pragma pack()成員總大小=92) 整體對齊整體對齊系數 = min((max(int,short,char), 16) = 4整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */四、結論8位元組和16位元組對齊試驗證明了「規則」的第3點:「當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果」。另外內存對齊是個很復雜的東西,上面所說的在有些時候也可能不正確。呵呵^_^[注1]什麼是「圓整」?舉例說明:如上面的8位元組對齊中的「整體對齊」,整體大小=9 按 4 圓整 = 12圓整的過程:從9開始每次加一,看是否能被4整除,這里9,10,11均不能被4整除,到12時可以,則圓整結束。
閱讀全文

與gcc82編譯器入口地址相關的資料

熱點內容
解壓神器大組合 瀏覽:728
多次編譯一個內核會快嗎 瀏覽:162
單片機伺服500k 瀏覽:868
linux安裝repo 瀏覽:799
app上的小說怎麼下載 瀏覽:230
陝西工會app所屬工會怎麼修改 瀏覽:177
手機如何設置app定向免流 瀏覽:246
程序員電腦什麼牌子的多 瀏覽:311
捷豹水泵編程 瀏覽:251
如何在電腦上查找dns伺服器地址 瀏覽:589
華為榮耀v40加密怎麼搞 瀏覽:489
單個伺服器怎麼確保網路安全 瀏覽:949
超高效定速壓縮機 瀏覽:628
怎樣把文件夾解壓到磁碟 瀏覽:826
java十進制十六進制轉換 瀏覽:404
安卓手機怎麼關閉識別物品 瀏覽:693
單片機通用燒錄器 瀏覽:55
如何設置catia伺服器開機運行 瀏覽:421
編程術語知多少 瀏覽:347
android模板代碼下載 瀏覽:766