基類與派生類假設是這樣的:
class base {
public:
int a = 0;
char c = 'a';
};
class derived :public base {
public:
int aa = 1;
double bb = 0.0;
};
cout << sizeof(base) << ' ' << sizeof(derived) << endl;
輸出:8 24
第一個8我理解,但是為什么派生類大小是24呢?
如果派生類只有成員aa,大小為12,只要加入double成員,int型就占用8個位元組了,這是為什么?
uj5u.com熱心網友回復:
估計是double bb需要對齊到64位地址邊界,所以前面就加了4位元組的填充。uj5u.com熱心網友回復:
最大成員是double,那么大小就是sizeof(double)的整數倍。uj5u.com熱心網友回復:
把char c去掉就變成16了...uj5u.com熱心網友回復:
自動對齊的概念是怎樣的啊?不是依據編譯器位數固定的嗎?
uj5u.com熱心網友回復:
是的,好像真是根據最大成員的大小有關。
uj5u.com熱心網友回復:
是有關,但并非對齊到最大成員的整數倍。應該是小于等于32位的成員對齊到32位地址邊界,大于32位小于等于64位的成員對齊到64位地址邊界... 依此類推。
uj5u.com熱心網友回復:
把char c去掉就變成16了...
是的,好像真是根據最大成員的大小有關。
是有關,但并非對齊到最大成員的整數倍。應該是小于等于32位的成員對齊到32位地址邊界,大于32位小于等于64位的成員對齊到64位地址邊界... 依此類推。
按照你的說法 struct x{double a;char b;}; 應該是多少
uj5u.com熱心網友回復:
最大成員是double,那么大小就是sizeof(double)的整數倍。
自動對齊的概念是怎樣的啊?不是依據編譯器位數固定的嗎?
T型別的起始位置是 sizeof(T) 的整數倍。
如果T是結構體,那么該結構體的起始位置是 結構體中最大元素的整數倍。
uj5u.com熱心網友回復:
把char c去掉就變成16了...
是的,好像真是根據最大成員的大小有關。
是有關,但并非對齊到最大成員的整數倍。應該是小于等于32位的成員對齊到32位地址邊界,大于32位小于等于64位的成員對齊到64位地址邊界... 依此類推。
按照你的說法 struct x{double a;char b;}; 應該是多少
結構成員對齊與否和對其尺寸受編譯選項的影響,與類成員對齊不是一回事。你可以在程式前面加上#pragma pack(4)、#pragma pack(1)之類的看看輸出效果。
uj5u.com熱心網友回復:
把char c去掉就變成16了...
是的,好像真是根據最大成員的大小有關。
是有關,但并非對齊到最大成員的整數倍。應該是小于等于32位的成員對齊到32位地址邊界,大于32位小于等于64位的成員對齊到64位地址邊界... 依此類推。
按照你的說法 struct x{double a;char b;}; 應該是多少
結構成員對齊與否和對其尺寸受編譯選項的影響,與類成員對齊不是一回事。你可以在程式前面加上#pragma pack(4)、#pragma pack(1)之類的看看輸出效果。
這些我知道啊
討論的不是在默認情況下么?
uj5u.com熱心網友回復:
編譯器默認位元組對齊功能你可以強制它按指定位元組數對齊
#pragma pack (1) //按單位元組對齊
輸出結果就是5 17
uj5u.com熱心網友回復:
1、一般設定的對齊方式為1,2,4位元組對齊方式,一般默認為4位元組(最大為8位元組)。結構的首地址必須是結構內最寬型別的整數倍地址;另外,結構體的每一個成員起始地址必須是自身型別大小的整數倍(需要特別注意的是windows下是這樣的,但在linux的gcc編譯器下最高為4位元組對齊2、結構體的整體大小必須可被對齊值整除,默認4(默認,且結構中的型別大小都小于默認的4)。
3、結構體的整體大小必須可被本結構內的最寬型別整除。你的派生類里的有DOUBLE,那么結構的大小最后必須可被8整除
以前測驗gcc最高只能被4整除,最近沒有測驗,不知道是否有變化
uj5u.com熱心網友回復:
1、一般設定的對齊方式為1,2,4位元組對齊方式,一般默認為4位元組(最大為8位元組)。結構的首地址必須是結構內最寬型別的整數倍地址;另外,結構體的每一個成員起始地址必須是自身型別大小的整數倍(需要特別注意的是windows下是這樣的,但在linux的gcc編譯器下最高為4位元組對齊
2、結構體的整體大小必須可被對齊值整除,默認4(默認,且結構中的型別大小都小于默認的4)。
3、結構體的整體大小必須可被本結構內的最寬型別整除。你的派生類里的有DOUBLE,那么結構的大小最后必須可被8整除
以前測驗gcc最高只能被4整除,最近沒有測驗,不知道是否有變化
因為一般情況double是8位元組,所以默認是8才對。
uj5u.com熱心網友回復:
class的size和struct的size不完全一樣吧?class有默認建構式。uj5u.com熱心網友回復:
把char c去掉就變成16了...
是的,好像真是根據最大成員的大小有關。
是有關,但并非對齊到最大成員的整數倍。應該是小于等于32位的成員對齊到32位地址邊界,大于32位小于等于64位的成員對齊到64位地址邊界... 依此類推。
按照你的說法 struct x{double a;char b;}; 應該是多少
結構成員對齊與否和對其尺寸受編譯選項的影響,與類成員對齊不是一回事。你可以在程式前面加上#pragma pack(4)、#pragma pack(1)之類的看看輸出效果。
這些我知道啊
討論的不是在默認情況下么?
與默認還是不默認情況無關,并不存在你說的大小是最大成員的整數倍這種規則。
uj5u.com熱心網友回復:
與默認還是不默認情況無關,并不存在你說的大小是最大成員的整數倍這種規則。
如果沒有的話,那么 new T[2]的時候第二個元素就不會對齊了。
uj5u.com熱心網友回復:
與默認還是不默認情況無關,并不存在你說的大小是最大成員的整數倍這種規則。
如果沒有的話,那么 new T[2]的時候第二個元素就不會對齊了。
沒有這種規則,只是因為現在很多編譯器,比如VC++ 2010+,默認是8位元組對齊,所以讓你產生了"最大成員是double,那么大小就是sizeof(double)的整數倍。"這種錯覺。
uj5u.com熱心網友回復:
比如:struct x {
int a;
char b;
int c;
double d;
};
#pragma pack(8)的情況下,sizeof(x)=24
而#pragma pack(4)的情況下,sizeof(x)=20
uj5u.com熱心網友回復:
與默認還是不默認情況無關,并不存在你說的大小是最大成員的整數倍這種規則。
如果沒有的話,那么 new T[2]的時候第二個元素就不會對齊了。
沒有這種規則,只是因為現在很多編譯器,比如VC++ 2010+,默認是8位元組對齊,所以讓你產生了"最大成員是double,那么大小就是sizeof(double)的整數倍。"這種錯覺。
討論的不就是默認情況下的么?
前提并沒有指定#pragma pack(8)還是#pragma pack(4)。
規則上還有一條,用于非默認對齊的情況的:如果最大元素大于默認對齊的值,那么就使用默認對齊的值。
uj5u.com熱心網友回復:
與默認還是不默認情況無關,并不存在你說的大小是最大成員的整數倍這種規則。
如果沒有的話,那么 new T[2]的時候第二個元素就不會對齊了。
沒有這種規則,只是因為現在很多編譯器,比如VC++ 2010+,默認是8位元組對齊,所以讓你產生了"最大成員是double,那么大小就是sizeof(double)的整數倍。"這種錯覺。
討論的不就是默認情況下的么?
前提并沒有指定#pragma pack(8)還是#pragma pack(4)。
規則上還有一條,用于非默認對齊的情況的:如果最大元素大于默認對齊的值,那么就使用默認對齊的值。
1. 不同的編譯器有不同的默認對其尺寸,不存在一個所謂的“默認的情況”。
2. 不存在你說的大小是最大成員的整數倍這種規則,這只是特定情況下的巧合。
uj5u.com熱心網友回復:
尤其是, 既然"前提并沒有指定#pragma pack(8)還是#pragma pack(4)",大小是最大成員的整數倍這種規則顯然完全是不成立的。
uj5u.com熱心網友回復:
最大成員是double,那么大小就是sizeof(double)的整數倍轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71226.html
