社区
工具平台和程序库
帖子详情
VC禁止结构体数据对齐
cattycat
2008-10-19 01:25:18
VC中如何禁止结构体数据对齐,谁知道,不知道在编译器中如何设置的?
谢谢!
...全文
572
5
打赏
收藏
VC禁止结构体数据对齐
VC中如何禁止结构体数据对齐,谁知道,不知道在编译器中如何设置的? 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cattycat
2008-10-19
打赏
举报
回复
谢谢各位了。
iGarlic
2008-10-19
打赏
举报
回复
在结构体的前面加上:
#pragma pack(1)
在结构体的结束位置加上:
#pragma pack()
如:
#pragma pack(1)
struct S1{
char a;
long b;
};
#pragma pack()
freshairfly
2008-10-19
打赏
举报
回复
强制一字节对齐:
#pragma pack(push, 1)
你定义的结构体/class
#pragma pack(pop)
帅得不敢出门
2008-10-19
打赏
举报
回复
pack
#pragma pack([n])
该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合
的紧凑对齐由/Zp选项设置。紧凑对齐用pace编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。该编译指示对定义无效。当你使用#pragma pack(n)时,这里n为1、2、4、8或16。第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n字节界限内。如果你使用无参量的 #pragma pack,结构成员被紧凑为以/Zp指定的值。该缺省/Zp紧凑值为/Zp8。
编译器也支持以下增强型语法:
#pragma pack([[{push|pop},][标识符,]][n])
若不同的组件使用pack编译指示指定不同的紧凑对齐,这个语法允许你把程序组件组合为一个单独的转换单元。
带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。编译指示的参量表从左到右读取。如果你使用push,则当前紧凑值被存储起来;如果你给出一个n的值,该值将成为新的紧凑值。若你指定一个标识符,即你选定一个名称,则该标识符将和这个新的的紧凑值联系起来。
带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值,并且将产生一个警告信息。若你使用pop且指定一个n的值,该值将成为新的紧凑值。
若你使用pop且指定一个标识符,所有存储在堆栈中的值将从栈中删除,直到找到一个匹配的标识符,这个与标识符相关的紧凑值也从栈中移出,并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,将使用命令行设置的紧凑值,并且将产生一个一级警告。缺省紧凑对齐为8。
pack编译指示的新的增强功能让你编写头文件,确保在遇到该头文件的前后的紧凑值是一样的。
/* File name: include1.h*/
#pragma pack(push,enter_include1)
/* 你的包括文件代码... */
#pragma pack(pop, enter_include1)
/* include1.h结束 */
在上面的例子中,当前紧凑值与标识符enter_include1联系起来,并被压入头文件的项中。头文件末尾的pack编译指示删除所有可能出现在头文件中的干预紧凑值,并且删除与enter_include1相关的紧凑值。因此确保该头文件的前后的紧凑值是相同的。
这种新功能也允许你使用代码,例如头文件,它可以使用pack编译指示设置不同于在你的代码中设置的紧凑值的紧凑对齐:
#pragma pack(push,before_include1)
#include "include1.h"
#pragma pack( pop,before_include1)
在上面的例子中,对于出现在include.h中的紧凑值的任何变化,你的代码是受到保护的。
帅得不敢出门
2008-10-19
打赏
举报
回复
#pragma pack(1)
VB和
VC
结构体
Dll参数传递
VB和
VC
结构体
Dll参数传递,VB中的
结构体
作为参数,传递
VC
中的
结构体
dll
5分钟搞定内存字节
对齐
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节
对齐
吧.
C/C++
结构体
字节
对齐
详解
结构体
的sizeof 先看一个
结构体
: struct S1 { char c; int i; }; sizeof(s1)在
VC
6中按默认设置得到的结果为8。 我们先看看sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那让我们来看看S1的内存分配情况 S1 s1 = { 'a', 0xFFFFFFFF }; 定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么 以我的
VC
6.0(sp6)为例,s1的地址为0x0012FF78,其
数据
内容如下: 0012FF78: 61 CC
vc
结构体
数组长度计算
定义自定义类型的数组时,时常出现所占字长不一致的情形,需要用此办法解决
sizeof(
结构体
)和内存
对齐
sizeof(
结构体
)和内存
对齐
sizeof(
结构体
)和内存
对齐
sizeof(
结构体
)和内存
对齐
sizeof(
结构体
)和内存
对齐
工具平台和程序库
24,860
社区成员
27,333
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章