再谈#pragma

2012-3-30

昨天小贤对#pragma算是有了一瞥,这瞥了一下还得继续瞥。昨天瞥出来#pragma的作用是“编译指示”,这就注定了在今后的N多瞥中#pragma都是与编译器有关的,只要是把握住这个主线,我们对#pragma就不用再“犹抱琵琶半遮面”的了,今天我就决定直接将其衣服“撕下”,(*^__^*)相当邪恶……

1.#pragmapack(参数)

这个昨天已经瞥过了,今天再瞥一下。 pack struct, union class等的成员对齐指定字节边界.与编译器的 /Zp选项开关不同,它不针对整个项目,而仅针对模块,比如一个编译单元。

其实pack的参数相当之多,瞥之:

1)#pragma pack(n)

将当前字节对齐值设为 n

2)#pragma pack()

将当前字节对齐值设为默认值(通常是8) 。

3)#pragma pack(show)

以警告信息的形式显示当前字节对齐的值,不过本人一直没验证出来。

4#pragma pack(push)#pragma pack(pop)

之所以将push和pop选项放在一行,明显是有原因的。因为他们哥儿俩成对使用,push是将当前对齐的方式压栈,pop是将栈中的对齐方式弹出。请看大屏幕:

#pragma pack(push)
#pragma pack(1) //注意,此处开始了哟
struct test1
{
	char a;
	int b;
	char c;
};
#pragma pack(pop)//注意,此处结束了哟

struct test2
{
	char a;
	int b;
	char c;
};
int main()
{/*此处省略*/}

那么,你用test1定义的变量大小就是6,用test2定义的变量大小就是12。So easy

5)#pragma pack(push, n)

先将当前字节对齐值压入编译栈栈顶, 然后再将 n 设为当前值。

6)#pragma pack(pop, n)
将编译栈栈顶的字节对齐值弹出, 然后丢弃, 再将 n 设为当前值。


Pack还有其他的选项,但是我不想再看下去了,先放一放,喝杯咖啡。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值