结构的大小,与成员类型的关系,困!!!!

pgood 2006-02-09 03:06:22
void CT1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
struct FRAME_RM_TYPE
{
int m_nValue:12; //变量的值
unsigned int m_nRes:2; //保留
unsigned int m_bOverfall:1; //溢出
unsigned int m_bInvalid:1; //无效
}*pValue;

struct FRAME_RM_TYPE1
{
short int m_nValue:12; //变量的值
unsigned int m_nRes:2; //保留
unsigned int m_bOverfall:1; //溢出
unsigned int m_bInvalid:1; //无效
};
struct FRAME_RM_TYPE2
{
short int m_nValue:12; //变量的值
unsigned short int m_nRes:2; //保留
unsigned short int m_bOverfall:1; //溢出
unsigned short int m_bInvalid:1; //无效
};

struct FRAME_RM_TYPE3
{
short int m_nValue:12; //变量的值
BYTE m_nRes:2; //保留
BYTE m_bOverfall:1; //溢出
BYTE m_bInvalid:1; //无效
};

int a= sizeof(FRAME_RM_TYPE);//4
int a1= sizeof(FRAME_RM_TYPE1);//8
int a2= sizeof(FRAME_RM_TYPE2);//2
int a3= sizeof(FRAME_RM_TYPE3);//4


}
///why
...全文
169 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rageliu 2006-02-10
  • 打赏
  • 举报
回复
字节对齐问题
xiaoyao19811201 2006-02-10
  • 打赏
  • 举报
回复
字节对齐
为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,
即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,
即起始地址能够被4整除。变量的对齐规则如下(32位系统):


Type
Alignment

char
在字节边界上对齐

short (16-bit)
在双字节边界上对齐

int and long (32-bit)
在4字节边界上对齐

float
在4字节边界上对齐

double
在8字节边界上对齐



structures
单独考虑结构体的个成员,它们在不同的字节边界上对齐。
其中最大的字节边界数就是该结构的字节边界数。
MSDN原话:Largest alignment requirement of any member
理解结构体的对齐方式有点挠头,如果结构体中有结构体成员,
那么这是一个递归的过程。
对齐方式影响结构体成员在结构体中的偏移设编译器设定的最大对齐字节边界数为n,
对于结构体中的某一成员item,它相对于结构首地址的实际字节对齐数目X应该满足
以下规则:

X = min(n, sizeof(item))

例如,对于结构体 struct {char a; int b} T;

当位于32位系统,n=8时:
a的偏移为0,
b的偏移为4,中间填充了3个字节, b的X为4;

当位于32位系统,n=2时:
a的偏移为0,
b的偏移为2,中间填充了1个字节,b的X为2;

结构体的sizeof
设结构体的最后一个成员为LastItem,其相对于结构体首地址的
偏移为offset(LastItem),其大小为sizeof(LastItem),结构体的字节对齐数为N,
则:结构体的sizeof 为: 若offset(LastItem)+ sizeof(LastItem)能够被N整除,
那么就是offset(LastItem)+ sizeof(LastItem),否则,在后面填充,
直到能够被N整除。

例如:32位系统,n=8,
结构体 struct {char a; char b;} T;
struct {char a; int b;} T1;
struct {char a; int b; char c;} T2;
sizeof(T) == 2; N = 1 没有填充
sizeof(T) == 8; N = 4 中间填充了3字节
sizeof(T2)==12; N = 4 中间,结尾各填充了3字节

注意:

1) 对于空结构体,sizeof == 1;因为必须保证结构体的每一个实例在内存中都
有独一无二的地址。

2) 结构体的静态成员不对结构体的大小产生影响,因为静态变量的存储位置与
结构体的实例地址无关。

例如:

struct {static int I;} T; struct {char a; static int I;} T1;
sizeof(T) == 1; sizeof(T1) == 1;

3) 某些编译器支持扩展指令设置变量或结构的对齐方式,如VC,
详见MSDN(alignment of structures)



并不是要求#pragma pack(8),就一定是每个成员都是8字节对齐
而是指一组成员要按照8字节对齐。
struct s1
{
short a; // 2字节
long b; // 4字节
};
整个s1小于8字节,因此s1就是8字节。

struct s2
{
char c; // 1字节
s1 d; // 8字节
__int64 e; // 8字节
};
整个s2小于12字节,但是由于#pragma pack(8)的限定,12不能与8字节对齐,因此s2就是24字节,c占用8字节


powerbamboo 2006-02-10
  • 打赏
  • 举报
回复
用Google搜索“内存对其”
zheng1357900 2006-02-09
  • 打赏
  • 举报
回复
结构的内存会按结构内变量最大字节数对齐.

8 16 32. 则都会变成32bit: 32 32 32.
kugou123 2006-02-09
  • 打赏
  • 举报
回复
字节对齐的问题

参考:http://www.xiaozhou.net/cooldog/blogview.asp?logID=120
lukeguo 2006-02-09
  • 打赏
  • 举报
回复
类型要一致:int或short int
否则它就产生2个变量了,猜测。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧