??xml version="1.0" encoding="utf-8" standalone="yes"?>国产专区一区二区三区,国产成人a亚洲精品,国产在线一在线二 http://www.aygfsteel.com/hjh132/category/30119.htmlIf a thing is worth doing it is worth doing well. zh-cn Mon, 24 Mar 2008 22:44:35 GMT Mon, 24 Mar 2008 22:44:35 GMT 60 含参数的宏与函数的区?/title> http://www.aygfsteel.com/hjh132/archive/2008/03/24/188206.html101℃太?/dc:creator>101℃太?/author>Mon, 24 Mar 2008 04:21:00 GMT http://www.aygfsteel.com/hjh132/archive/2008/03/24/188206.html http://www.aygfsteel.com/hjh132/comments/188206.html http://www.aygfsteel.com/hjh132/archive/2008/03/24/188206.html#Feedback 0 http://www.aygfsteel.com/hjh132/comments/commentRss/188206.html http://www.aygfsteel.com/hjh132/services/trackbacks/188206.html 1. 函数调用Ӟ先求出实参表辑ּ的|然后带入形参。而用带参的宏只是进行简单的字符替换?/span>
2. 函数调用是在E序q行时处理的Q分配(f)时的内存单元Q而宏展开则是在编译时q行的,在展开时ƈ不分配内存单元,不进行值的传递处理,也没?#8220;q回?#8221;的概c?/span>
3. 对函C的实参和形参都要定义cdQ二者的cd要求一_(d)如不一_(d)应进行类型{换;而宏不存在类型问题,宏名无类型,它的参数也无cdQ只是一个符号代表,展开时带入指定的字符卛_。宏定义Ӟ字符串可以是Mcd的数据?/span>
4. 调用函数只可得到一个返回|而用宏可以设法得到几个结果?/span>
5. 使用宏次数多Ӟ宏展开后源E序长,因ؓ(f)每展开一ơ都使程序增长,而函数调用不使源E序变长?/span>
6. 宏替换不占运行时_(d)只占~译旉Q而函数调用则占运行时_(d)分配单元、保留现场、g递、返回)?/span>
一般来_(d)用宏来代表简短的表达式比较合适?/span>
有时使用宏时?x)引L(fng)解错误:(x)
例:(x)
Qinclude<iostream.h>
#define max(a,b) ((a>b)?a:b)
void main()
{
int i=3,j=2;
cout<<max(++i,j)<<endl;
cout<<i<<" "<<j<<endl;
}
q行l果Q?/span>
5
5 2
]]>C struct 中字节对齐问?/title> http://www.aygfsteel.com/hjh132/archive/2008/03/17/186849.html101℃太?/dc:creator>101℃太?/author>Mon, 17 Mar 2008 12:26:00 GMT http://www.aygfsteel.com/hjh132/archive/2008/03/17/186849.html http://www.aygfsteel.com/hjh132/comments/186849.html http://www.aygfsteel.com/hjh132/archive/2008/03/17/186849.html#Feedback 0 http://www.aygfsteel.com/hjh132/comments/commentRss/186849.html http://www.aygfsteel.com/hjh132/services/trackbacks/186849.html
struct MyStruct
{
double m4;
char m1;
int m3Q?
};
struct MyStruct {
char m1;
double m4;
?nbsp; int m3;
};
#pragma pack(push)//保存寚w状?
#pragma pack(16) //讄?6字节寚w
struct test
{
char m1;
int m3;
double m4;
};
#pragma pack(pop)//恢复寚w状?
如果你的{案不是16Q?4?6Q相信下面的内容对你很有帮助?br />
1?sizeof应用在结构上的情?
L(fng)下面的结构:(x)
struct MyStruct
{
double dda1;
char dda;
int type
};
对结构MyStruct采用sizeof?x)出C么结果呢Qsizeof(MyStruct)为多呢Q也怽
?x)这hQ?
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是当在VC中测试上面结构的大小Ӟ你会(x)发现sizeof(MyStruct)?6。你知道Z
么在VC中会(x)得出q样一个结果吗Q?
其实Q这是VC对变量存储的一个特D处理?span style="color: red; background-color: yellow">Z提高CPU的存储速度QVC对一些变量的
起始地址做了“寚w”处理?/span>在默认情况下QVC规定各成员变量存攄起始地址相对于结
构的起始地址的偏U量必须变量的类型所占用的字节数的倍数。下面列出常用类型的
寚w方式(vc6.0,32位系l??br />
cd 寚w方式Q变量存攄起始地址相对于结构的起始地址的偏U量Q?
Char 偏移量必Mؓ(f)sizeof(char)?的倍数
Short 偏移量必Mؓ(f)sizeof(short)?的倍数
int 偏移量必Mؓ(f)sizeof(int)?的倍数
float 偏移量必Mؓ(f)sizeof(float)?的倍数
double ?偏移量必Mؓ(f)sizeof(double)?的倍数
各成员变量在存放的时候根据在l构中出现的序依次甌I间Q同时按照上面的?br />
齐方式调整位|,I缺的字节VC?x)自动填充。同时VCZ保l构的大ؓ(f)l构的字节边
界数Q即该结构中占用最大空间的cd所占用的字节数Q的倍数Q所以在为最后一个成?br />
变量甌I间后,q会(x)Ҏ(gu)需要自动填充空~的字节?
下面用前面的例子来说明VC到底怎么h存放l构的?
struct MyStruct
{
double dda1;
char dda;
int type
}Q?
Z面的l构分配I间的时候,VCҎ(gu)成员变量出现的顺序和寚w方式Q先为第一?br />
成员dda1分配I间Q其起始地址跟结构的起始地址相同Q刚好偏U量0刚好为sizeof(doub
le)的倍数Q,该成员变量占用sizeof(double)=8个字节;接下来ؓ(f)W二个成员dda分配I?br />
_(d)q时下一个可以分配的地址对于l构的v始地址的偏U量?Q是sizeof(char)的倍数
Q所以把dda存放在偏U量?的地Ҏ(gu)_齐方式,该成员变量占?sizeof(char)=1个字
节;接下来ؓ(f)W三个成员type分配I间Q这时下一个可以分配的地址对于l构的v始地址
的偏U量?Q不是sizeof (int)=4的倍数Qؓ(f)了满_齐方式对偏移量的U束问题QVC?br />
动填?个字节(q三个字节没有放什么东西)Q这时下一个可以分配的地址对于l构的v
始地址的偏U量?2Q刚好是sizeof(int)=4的倍数Q所以把type存放在偏U量?2的地?br />
Q该成员变量占用sizeof(int)=4个字节;q时整个l构的成员变量已l都分配了空_(d)?br />
的占用的I间大小为:(x)8+1+3+4=16Q刚好ؓ(f)l构的字节边界数Q即l构中占用最大空间的
cd所占用的字节数sizeof(double)=8Q的倍数Q所以没有空~的字节需要填充。所以整
个结构的大小为:(x)sizeof(MyStruct)=8+1+ 3+4=16Q其中有3个字节是VC自动填充的,没有
放Q何有意义的东ѝ?
下面再D个例子,交换一下上面的MyStruct的成员变量的位置Q它变成下面的情况
Q?
struct MyStruct
{
char dda;
double dda1;
int type
}Q?
q个l构占用的空间ؓ(f)多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)?4。结
合上面提到的分配I间的一些原则,分析下VC怎么样ؓ(f)上面的结构分配空间的。(单说
明)
struct MyStruct
{
char dda;//偏移量ؓ(f)0Q满_齐方式,dda占用1个字节;
double dda1;//下一个可用的地址的偏U量?Q不是sizeof(double)=8
//的倍数Q需要补?个字节才能偏移量变?Q满_?
//方式Q,因此VC自动填充7个字节,dda1存放在偏U量?
//的地址上,它占?个字节?
int typeQ?/下一个可用的地址的偏U量?6Q是sizeof(int)=4的?
//敎ͼ满int的对齐方式,所以不需要VC自动填充Qtype?
//攑֜偏移量ؓ(f)16的地址上,它占?个字节?
}Q?/所有成员变量都分配了空_(d)I间ȝ大小?+7+8+4=20Q不是结?
//的节边界敎ͼ即结构中占用最大空间的cd所占用的字节数sizeof
//(double)=8Q的倍数Q所以需要填?个字节,以满结构的大小?
//sizeof(double)=8的倍数?
所以该l构ȝ大小为:(x)sizeof(MyStruc)?+7+8+4+4=24。其中ȝ?+4=11个字?br />
是VC自动填充的,没有放Q何有意义的东ѝ?br />
VC对结构的存储的特D处理确实提高CPU存储变量的速度Q但是有时候也带来了一些麻
烦,我们也屏蔽掉变量默认的对齐方式,自己可以讑֮变量的对齐方式?br />
VC 中提供了#pragma pack(n)来设定变量以n字节寚w方式。n字节寚w是说变量存
攄起始地址的偏U量有两U情况:(x)W一、如果n大于{于该变量所占用的字节数Q那么偏
U量必须满默认的对齐方式,W二、如果n于该变量的cd所占用的字节数Q那么偏U?br />
量ؓ(f)n的倍数Q不用满默认的寚w方式。结构的d也有个U束条gQ分下面两种情况
Q如果n大于所有成员变量类型所占用的字节数Q那么结构的d必Mؓ(f)占用I间最大的
变量占用的空间数的倍数Q?
否则必须为n的倍数。下面D例说明其用法?
#pragma pack(push) //保存寚w状?
#pragma pack(4)//讑֮?字节寚w
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢复寚w状?
以上l构的大ؓ(f)16Q下面分析其存储情况Q首先ؓ(f)m1分配I间Q其偏移量ؓ(f)0Q满?br />
我们自己讑֮的对齐方式(4字节寚wQ,m1占用1个字节。接着开始ؓ(f) m4分配I间Q这?br />
其偏U量?Q需要补?个字节,q样使偏U量满为n=4的倍数Q因为sizeof(double)?br />
于nQ?m4占用8个字节。接着为m3分配I间Q这时其偏移量ؓ(f)12Q满ؓ(f)4的倍数Qm3占用
4个字节。这时已lؓ(f)所有成员变量分配了I间Q共分配?6个字节,满为n的倍数。如
果把上面?pragma pack(4)改ؓ(f)#pragma pack(16)Q那么我们可以得到结构的大小?4?br />
Q请读者自己分析)
2?sizeof用法ȝ
在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面?br />
参数对sizeof的用法做个ȝ?
AQ?参数为数据类型或者ؓ(f)一般变量。例如sizeof(int),sizeof(long){等。这U情
况要注意的是不同pȝpȝ或者不同编译器得到的结果可能是不同的。例如intcd?6?br />
pȝ中占2个字节,?2位系l中?个字节?
BQ?参数为数l或指针。下面D例说?
int a[50]; //sizeof(a)=4*50=200; 求数l所占的I间大小
int *a=new int[50];// sizeof(a)=4; aZ个指针,sizeof(a)是求指针
//的大??2位系l中Q当然是?个字节?
CQ?参数为结构或cRSizeof应用在类和结构的处理情况是相同的。但有两炚w要注
意,W一、结构或者类中的静态成员不对结构或者类的大生媄响,因ؓ(f)静态变量的?br />
储位|与l构或者类的实例地址无关?
W二、没有成员变量的l构或类的大ؓ(f)1Q因为必M证结构或cȝ每一
个实例在内存中都有唯一的地址?
下面举例说明Q?
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,sZ个指针?
Class test1{ };//sizeof(test1)=1;
DQ?参数为其他。下面D例说明?
int func(char s[5]);
{
cout< //数的参数在传递的时候系l处理ؓ(f)一个指针,所
//以sizeof(s)实际上ؓ(f)求指针的大小?
return 1;
}
sizeof(func(“1234”))=4//因ؓ(f)func的返回类型ؓ(f)intQ所以相当于
//求sizeof(int).
以上为sizeof的基本用法,在实际的使用中要注意分析VC的分配变量的分配{略Q这
L(fng)话可以避免一些错?
]]>
վ֩ģ壺
Ǧɽ |
ξ |
麣 |
γ |
|
ؼ |
|
|
е |
|
ɽ |
|
|
|
ʯ |
|
|
Ҫ |
ƾ |
|
Ӱ |
|
|
|
˿ |
|
|
|
|
¡ |
ʯȪ |
|
̫ |
̶ |
ʼ |
|
̫ |
|
ݳ |
|
|