总结面试时没有回答上的内存对齐问题
前兩天面試某公司時(shí),沒(méi)有回答上的一個(gè)問(wèn)題,總結(jié)如下,以供參考。
問(wèn):下面這個(gè)結(jié)構(gòu)類型的實(shí)例變量占用多少內(nèi)存:
struct struct1
{
??? int i;
??? short j;
??? char c;
};
我反問(wèn):是啥語(yǔ)言啥機(jī)器啥編譯環(huán)境?
他回答說(shuō):VC6.0下。
我:內(nèi)存對(duì)齊后占8byte。
他又繼續(xù)問(wèn):如何讓它只占7byte?
我的第一反應(yīng)是使用位段,正準(zhǔn)備回答,又感覺(jué)不對(duì),位段不能讓它不對(duì)齊啊。又想了幾秒鐘,還是不會(huì),只好回他說(shuō)沒(méi)玩過(guò)……
今天下午去圖書館翻了下《代碼優(yōu)化:有效使用內(nèi)存》,發(fā)現(xiàn)里面提到了兩種方法:
法1:
#pragma pack(push)
#pragma pack(1)
struct struct1
{
??? int i;
??? short j;
??? char c;
};
#pragma pack(pop)
法2:
修改編譯指令的參數(shù),來(lái)禁止內(nèi)存對(duì)齊:
VC++?????? ? ? ? :/Zn1(VS2005下,右擊項(xiàng)目-屬性-配置屬性-C/C++-代碼生成-結(jié)構(gòu)成員對(duì)齊-選“1字節(jié)(/Zn1):”(即禁止內(nèi)存對(duì)齊),默認(rèn)是使用默認(rèn)值,即按照結(jié)構(gòu)中占用空間最大的成員進(jìn)行對(duì)齊。的size進(jìn)行對(duì)齊。
Borland C++ : /-a1
法2是對(duì)整個(gè)項(xiàng)目禁用內(nèi)存對(duì)齊,而法1可以針對(duì)特定的結(jié)構(gòu)禁用內(nèi)存對(duì)齊,其提供了更大的靈活性.
另外,該書中還提到:
char不對(duì)齊;
short沿偶地址對(duì)齊;
int/float沿取值為4的倍數(shù)的地址對(duì)齊。
double沿取值為8的倍數(shù)的地址對(duì)齊。
VS2005下,默認(rèn)是使用默認(rèn)值,即按照結(jié)構(gòu)中占用空間最大的成員進(jìn)行對(duì)齊,我們可以測(cè)試下面這個(gè)結(jié)構(gòu):
struct struct2
{
??? char i;
??? short d;
??? double c;
??? short j;
};
//保持為默認(rèn)值或修改編譯參數(shù)/Zn?,猜下sizeof結(jié)果為多少?:)
printf("struct2:%d\n",sizeof(struct2));
struct2 st;
printf("%p\n",&st.i);
printf("%p\n",&st.d);
printf("%p\n",&st.c);
printf("%p\n",&st.j);
?
補(bǔ)充:數(shù)據(jù)的手工對(duì)齊:
char *p;
int temp = align_power-1;
p=(char*)malloc(need_size +?temp;
p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以釋放p前記得要?dú)w位
注:align_power是所需要的對(duì)齊冪,char*(也可以為int*)是指針類型。另外,釋放p之前記得讓其指向所申請(qǐng)的內(nèi)存的首地址上。
本文轉(zhuǎn)自Silent Void博客園博客,原文鏈接:http://www.cnblogs.com/happyhippy/archive/2006/11/10/601224.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的总结面试时没有回答上的内存对齐问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机图形学真实感显示代码,计算机图形学
- 下一篇: 初三学生多会筹备计算机中考考试,2020