真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言虛函數(shù)有哪些 c中虛函數(shù)的作用

c語言中,有虛函數(shù)嗎?

有虛函數(shù)的話就有虛表,虛表保存虛函數(shù)地址,一個地址占用的長度根據(jù)編譯器不同有可能不同,vs里面是8個字節(jié),在devc++里面是4個字節(jié)。類和結(jié)構(gòu)體的對齊方式相同,有兩條規(guī)則

創(chuàng)新互聯(lián)主營柳河網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,柳河h5成都微信小程序搭建,柳河網(wǎng)站營銷推廣歡迎柳河等地區(qū)企業(yè)咨詢

1、數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員的對齊按照#pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度中,比較小的那個進(jìn)行。

2、結(jié)構(gòu)(或聯(lián)合)的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對齊,對齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個進(jìn)行

下面是我收集的關(guān)于內(nèi)存對齊的一篇很好的文章:

在最近的項目中,我們涉及到了“內(nèi)存對齊”技術(shù)。對于大部分程序員來說,“內(nèi)存對齊”對他們來說都應(yīng)該是“透明的”?!皟?nèi)存對齊”應(yīng)該是編譯器的 “管轄范圍”。編譯器為程序中的每個“數(shù)據(jù)單元”安排在適當(dāng)?shù)奈恢蒙稀5荂語言的一個特點(diǎn)就是太靈活,太強(qiáng)大,它允許你干預(yù)“內(nèi)存對齊”。如果你想了解更加底層的秘密,“內(nèi)存對齊”對你就不應(yīng)該再透明了。

一、內(nèi)存對齊的原因

大部分的參考資料都是如是說的:

1、平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。

2、性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪問。

二、對齊規(guī)則

每個特定平臺上的編譯器都有自己的默認(rèn)“對齊系數(shù)”(也叫對齊模數(shù))。程序員可以通過預(yù)編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數(shù),其中的n就是你要指定的“對齊系數(shù)”。

規(guī)則:

1、數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員的對齊按照#pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度中,比較小的那個進(jìn)行。

2、結(jié)構(gòu)(或聯(lián)合)的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對齊,對齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個進(jìn)行。

3、結(jié)合1、2顆推斷:當(dāng)#pragma pack的n值等于或超過所有數(shù)據(jù)成員長度的時候,這個n值的大小將不產(chǎn)生任何效果。

三、試驗

我們通過一系列例子的詳細(xì)說明來證明這個規(guī)則吧!

我試驗用的編譯器包括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)

首先我們首先確認(rèn)在試驗平臺上的各個類型的size,經(jīng)驗證兩個編譯器的輸出均為:

sizeof(char) = 1

sizeof(short) = 2

sizeof(int) = 4

我們的試驗過程如下:通過#pragma pack(n)改變“對齊系數(shù)”,然后察看sizeof(struct test_t)的值。

1、1字節(jié)對齊(#pragma pack(1))

輸出結(jié)果:sizeof(struct test_t) = 8 [兩個編譯器輸出一致]

分析過程:

1) 成員數(shù)據(jù)對齊

#pragma pack(1)

struct test_t {

int a; /* 長度4 1 按1對齊;起始o(jì)ffset=0 0%1=0;存放位置區(qū)間[0,3] */

char b; /* 長度1 = 1 按1對齊;起始o(jì)ffset=4 4%1=0;存放位置區(qū)間[4] */

short c; /* 長度2 1 按1對齊;起始o(jì)ffset=5 5%1=0;存放位置區(qū)間[5,6] */

char d; /* 長度1 = 1 按1對齊;起始o(jì)ffset=7 7%1=0;存放位置區(qū)間[7] */

};

#pragma pack()

成員總大小=8

2) 整體對齊

整體對齊系數(shù) = min((max(int,short,char), 1) = 1

整體大小(size)=$(成員總大小) 按 $(整體對齊系數(shù)) 圓整 = 8 /* 8%1=0 */ [注1]

2、2字節(jié)對齊(#pragma pack(2))

輸出結(jié)果:sizeof(struct test_t) = 10 [兩個編譯器輸出一致]

分析過程:

1) 成員數(shù)據(jù)對齊

#pragma pack(2)

struct test_t {

int a; /* 長度4 2 按2對齊;起始o(jì)ffset=0 0%2=0;存放位置區(qū)間[0,3] */

char b; /* 長度1 2 按1對齊;起始o(jì)ffset=4 4%1=0;存放位置區(qū)間[4] */

short c; /* 長度2 = 2 按2對齊;起始o(jì)ffset=6 6%2=0;存放位置區(qū)間[6,7] */

char d; /* 長度1 2 按1對齊;起始o(jì)ffset=8 8%1=0;存放位置區(qū)間[8] */

};

#pragma pack()

成員總大小=9

2) 整體對齊

整體對齊系數(shù) = min((max(int,short,char), 2) = 2

整體大小(size)=$(成員總大小) 按 $(整體對齊系數(shù)) 圓整 = 10 /* 10%2=0 */

3、4字節(jié)對齊(#pragma pack(4))

輸出結(jié)果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]

分析過程:

1) 成員數(shù)據(jù)對齊

#pragma pack(4)

struct test_t {

int a; /* 長度4 = 4 按4對齊;起始o(jì)ffset=0 0%4=0;存放位置區(qū)間[0,3] */

char b; /* 長度1 4 按1對齊;起始o(jì)ffset=4 4%1=0;存放位置區(qū)間[4] */

short c; /* 長度2 4 按2對齊;起始o(jì)ffset=6 6%2=0;存放位置區(qū)間[6,7] */

char d; /* 長度1 4 按1對齊;起始o(jì)ffset=8 8%1=0;存放位置區(qū)間[8] */

};

#pragma pack()

成員總大小=9

2) 整體對齊

整體對齊系數(shù) = min((max(int,short,char), 4) = 4

整體大小(size)=$(成員總大小) 按 $(整體對齊系數(shù)) 圓整 = 12 /* 12%4=0 */

4、8字節(jié)對齊(#pragma pack(8))

輸出結(jié)果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]

分析過程:

1) 成員數(shù)據(jù)對齊

#pragma pack(8)

struct test_t {

int a; /* 長度4 8 按4對齊;起始o(jì)ffset=0 0%4=0;存放位置區(qū)間[0,3] */

char b; /* 長度1 8 按1對齊;起始o(jì)ffset=4 4%1=0;存放位置區(qū)間[4] */

short c; /* 長度2 8 按2對齊;起始o(jì)ffset=6 6%2=0;存放位置區(qū)間[6,7] */

char d; /* 長度1 8 按1對齊;起始o(jì)ffset=8 8%1=0;存放位置區(qū)間[8] */

};

#pragma pack()

成員總大小=9

2) 整體對齊

整體對齊系數(shù) = min((max(int,short,char), 8) = 4

整體大小(size)=$(成員總大小) 按 $(整體對齊系數(shù)) 圓整 = 12 /* 12%4=0 */

5、16字節(jié)對齊(#pragma pack(16))

輸出結(jié)果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]

分析過程:

1) 成員數(shù)據(jù)對齊

#pragma pack(16)

struct test_t {

int a; /* 長度4 16 按4對齊;起始o(jì)ffset=0 0%4=0;存放位置區(qū)間[0,3] */

char b; /* 長度1 16 按1對齊;起始o(jì)ffset=4 4%1=0;存放位置區(qū)間[4] */

short c; /* 長度2 16 按2對齊;起始o(jì)ffset=6 6%2=0;存放位置區(qū)間[6,7] */

char d; /* 長度1 16 按1對齊;起始o(jì)ffset=8 8%1=0;存放位置區(qū)間[8] */

};

#pragma pack()

成員總大小=9

2) 整體對齊

整體對齊系數(shù) = min((max(int,short,char), 16) = 4

整體大小(size)=$(成員總大小) 按 $(整體對齊系數(shù)) 圓整 = 12 /* 12%4=0 */

四、結(jié)論

8字節(jié)和16字節(jié)對齊試驗證明了“規(guī)則”的第3點(diǎn):“當(dāng)#pragma pack的n值等于或超過所有數(shù)據(jù)成員長度的時候,這個n值的大小將不產(chǎn)生任何效果”。另外內(nèi)存對齊是個很復(fù)雜的東西,上面所說的在有些時候也可能不正確。呵呵^_^

[注1]

什么是“圓整”?

舉例說明:如上面的8字節(jié)對齊中的“整體對齊”,整體大小=9 按 4 圓整 = 12

圓整的過程:從9開始每次加一,看是否能被4整除,這里9,10,11均不能被4整除,到12時可以,則圓整結(jié)束。

哪些函數(shù)能被聲明為虛函數(shù)?為什么?

class A

{

virtual void fun()

{

printf("CA");

}

}

class CA: public A

{

virtual void fun(){

printf("CA");

}

}

CA* pC = new CA;

A* pA = pC;

pA-fun;//調(diào)用的是CA::fun();

這就是動態(tài)綁定。

一般有子類的類的析構(gòu)函數(shù)要是虛函數(shù),當(dāng)你需要改變指針類型為父類型(便于管理),但是實(shí)現(xiàn)要依賴于子類的話就需要虛函數(shù)。更詳細(xì)的多BAIDU GOOGLE,資料很多的。

C語言中void DigDisplay()是什么意思?

您好,很高興回答您的問題。

由于沒有看到其他的內(nèi)容所以只能從結(jié)構(gòu)上來說明相關(guān)含義。

void digdisplay()表示的是這個函數(shù)的定義,其中void表示函數(shù)不帶任何的返回值,digdisplay表示的是函數(shù)名,括號中表示函數(shù)的參數(shù),這里是空的,所以表示不帶任何的返回值。

以上就是我的回答,敬請指正。

什么函數(shù)不能聲明為虛函數(shù)?

inline, static, constructor ,template 函數(shù)都不能 為虛函數(shù),而析構(gòu)函數(shù)可以。

為什么呢:

inline: 編譯器替換; 而虛函數(shù)是為了解決運(yùn)行期間綁定。

static:class 成員; 編譯期間就給class了。

constructor: 構(gòu)造函數(shù)表示要生成一個class的object;假設(shè)是virtual的,那就說不知道這個實(shí)例化derived還是based的class。但是類型實(shí)例化必須在編譯期確定(否則編譯器不知道到底是什么對象了)

template:模板實(shí)例是在 compile-time,virtual就意味著在run-time確定。這讓編譯器設(shè)計者為難了,這就是說虛函數(shù)表要指向各種版本的 template function 實(shí)例,代碼設(shè)計者confuse,編譯器設(shè)計者也覺得蠻煩。


分享標(biāo)題:c語言虛函數(shù)有哪些 c中虛函數(shù)的作用
本文路徑:http://weahome.cn/article/ddoshee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部