struct A{
char a;
int b;
char c[15];
char d[10];
}
小白請教這里邊記憶體對齊是什么樣子的?
uj5u.com熱心網友回復:
不知道,我知道你最后少寫個分號uj5u.com熱心網友回復:
這跟編譯器,以及專案的設定有關。uj5u.com熱心網友回復:
記憶體對齊一般是指按位元組大小來分配記憶體,也就是說一般你申請不到占用不滿一個位元組的記憶體(即使是用位占用符)比如
char *c = (char*)malloc(sizeof(char)/2); //想按半個位元組來申請記憶體,但系統實際會自動按一個位元組來分配記憶體
或許有些編譯器支持記憶體壓縮之類的設定
uj5u.com熱心網友回復:
上面舉的例子可能不恰當,sizeof(char)/2 就是0了,不過就是表明一下這個意思struct A {
int a:1; //a只使用記憶體的1個bit,但是A也會分配4個位元組大小的記憶體
}
A a;
printf("%d", sizeof(a));
uj5u.com熱心網友回復:
struct A{char a;
int b;
char c[15];
char d[10];
}
char a占據一個位元組,分配記憶體時位置是0,1,2,3...分配的。所以此時char a在0的位置。
是int,占據4個位元組,分配記憶體時是0,4,8...分配的,現在0的位置被占據了,所以int b在4的位置,占據4個位元組,為4,5,6,7。1,2,3是空的,這就是位元組對齊的其中一種。
c[15]和d[10]同理占據[8,22]和[23,32],此時這個結構體總共占用了33個位元組[0,32],因為位元組對齊的原因,總的位元組數要是結構體中最大的資料型別位元組的整數倍,即4的整數倍,所以33+3=36,這個結構體總共占據36個位元組。
uj5u.com熱心網友回復:
看你的編譯器以及系統。Linux 32位系統是默認以4位元組對齊的,對于64位系統,那么應該是8位元組對齊;建議你在自己的環境下寫程式,判斷一下(sizeof)
uj5u.com熱心網友回復:
明白了,謝謝咯。之前一直糾結為char c陣列分配多少空間,它是15個位元組,可是直接15個位元組也不太方便訪問,但我訪問的時候又確實是只有15個位元組,所以很疑惑15個位元組的話cpu要怎么方便訪問。
uj5u.com熱心網友回復:
感謝指正,疏忽了。
uj5u.com熱心網友回復:
是的,我沒有表達清楚具體想問的是什么??
uj5u.com熱心網友回復:
陣列的話,就成員一個個分配呀 char a[15] 就是連續分配15char型的記憶體。
uj5u.com熱心網友回復:
上面舉的例子可能不恰當,sizeof(char)/2 就是0了,不過就是表明一下這個意思
struct A {
int a:1; //a只使用記憶體的1個bit,但是A也會分配4個位元組大小的記憶體
}
A a;
printf("%d", sizeof(a));
get it!
uj5u.com熱心網友回復:
struct A{
char a;
int b;
char c[15];
char d[10];
}
char a占據一個位元組,分配記憶體時位置是0,1,2,3...分配的。所以此時char a在0的位置。
是int,占據4個位元組,分配記憶體時是0,4,8...分配的,現在0的位置被占據了,所以int b在4的位置,占據4個位元組,為4,5,6,7。1,2,3是空的,這就是位元組對齊的其中一種。
c[15]和d[10]同理占據[8,22]和[23,32],此時這個結構體總共占用了33個位元組[0,32],因為位元組對齊的原因,總的位元組數要是結構體中最大的資料型別位元組的整數倍,即4的整數倍,所以33+3=36,這個結構體總共占據36個位元組。
明白了,謝謝咯。之前一直糾結為char c陣列分配多少空間,它是15個位元組,可是直接15個位元組也不太方便訪問,但我訪問的時候又確實是只有15個位元組,所以很疑惑15個位元組的話cpu要怎么方便訪問。
陣列的話,就成員一個個分配呀 char a[15] 就是連續分配15char型的記憶體。
那cpu想要訪問c陣列中的資料的話,一下讀取四個位元組,這樣不是會多讀取d的一個位元組么,為什么不是給c分配16個,這樣方便讀取c 跟d中的資料么
uj5u.com熱心網友回復:
struct A{
char a;
int b;
char c[15];
char d[10];
}
char a占據一個位元組,分配記憶體時位置是0,1,2,3...分配的。所以此時char a在0的位置。
是int,占據4個位元組,分配記憶體時是0,4,8...分配的,現在0的位置被占據了,所以int b在4的位置,占據4個位元組,為4,5,6,7。1,2,3是空的,這就是位元組對齊的其中一種。
c[15]和d[10]同理占據[8,22]和[23,32],此時這個結構體總共占用了33個位元組[0,32],因為位元組對齊的原因,總的位元組數要是結構體中最大的資料型別位元組的整數倍,即4的整數倍,所以33+3=36,這個結構體總共占據36個位元組。
明白了,謝謝咯。之前一直糾結為char c陣列分配多少空間,它是15個位元組,可是直接15個位元組也不太方便訪問,但我訪問的時候又確實是只有15個位元組,所以很疑惑15個位元組的話cpu要怎么方便訪問。
陣列的話,就成員一個個分配呀 char a[15] 就是連續分配15char型的記憶體。
那cpu想要訪問c陣列中的資料的話,一下讀取四個位元組,這樣不是會多讀取d的一個位元組么,為什么不是給c分配16個,這樣方便讀取c 跟d中的資料么
cpu訪問的話,也是看資料型別的,int型會從讀取4個位元組,char型的每次讀取一個位元組呀
uj5u.com熱心網友回復:
試一下面代碼,具體看看輸出什么#pragma pack(8)
struct A {
char a;
int b;
char c[15];
char d[10];
};
int main()
{
cout << "A size 為" << sizeof(A)<<endl;
cout <<"a 偏移量"<<offsetof(A,a)<< endl;
cout << "b 偏移量" << offsetof(A, b) << endl;
cout << "c偏移量" << offsetof(A, c) << endl;
cout << "d偏移量" << offsetof(A, d) << endl;
return 0;
}
編譯器 vs2015,你可以編譯為32位程式,再把它編譯為64位,看看有何區別?
再修改#progma pack的引數,把它改為1,2,4,8,16 看看有何卻別。
uj5u.com熱心網友回復:
struct A{
char a;
int b;
char c[15];
char d[10];
}
char a占據一個位元組,分配記憶體時位置是0,1,2,3...分配的。所以此時char a在0的位置。
是int,占據4個位元組,分配記憶體時是0,4,8...分配的,現在0的位置被占據了,所以int b在4的位置,占據4個位元組,為4,5,6,7。1,2,3是空的,這就是位元組對齊的其中一種。
c[15]和d[10]同理占據[8,22]和[23,32],此時這個結構體總共占用了33個位元組[0,32],因為位元組對齊的原因,總的位元組數要是結構體中最大的資料型別位元組的整數倍,即4的整數倍,所以33+3=36,這個結構體總共占據36個位元組。
明白了,謝謝咯。之前一直糾結為char c陣列分配多少空間,它是15個位元組,可是直接15個位元組也不太方便訪問,但我訪問的時候又確實是只有15個位元組,所以很疑惑15個位元組的話cpu要怎么方便訪問。
陣列的話,就成員一個個分配呀 char a[15] 就是連續分配15char型的記憶體。
那cpu想要訪問c陣列中的資料的話,一下讀取四個位元組,這樣不是會多讀取d的一個位元組么,為什么不是給c分配16個,這樣方便讀取c 跟d中的資料么
cpu訪問的話,也是看資料型別的,int型會從讀取4個位元組,char型的每次讀取一個位元組呀
非常感謝
,明白了,之前進了死胡同,還一直以為會以4位元組去訪問,char型別的話無論是字符還是陣列都會以1位元組為單位去訪問
uj5u.com熱心網友回復:
試一下面代碼,具體看看輸出什么#pragma pack(8)
struct A {
char a;
int b;
char c[15];
char d[10];
};
int main()
{
cout << "A size 為" << sizeof(A)<<endl;
cout <<"a 偏移量"<<offsetof(A,a)<< endl;
cout << "b 偏移量" << offsetof(A, b) << endl;
cout << "c偏移量" << offsetof(A, c) << endl;
cout << "d偏移量" << offsetof(A, d) << endl;
return 0;
}
編譯器 vs2015,你可以編譯為32位程式,再把它編譯為64位,看看有何區別?
再修改#progma pack的引數,把它改為1,2,4,8,16 看看有何卻別。
非常感謝
,已經搞清楚啦
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/114571.html
標籤:C語言
上一篇:求教!提交后總顯示wrong answer。。。不知錯在何處
下一篇:結果不對,大佬幫忙解決一下
