社区
C++ 语言
帖子详情
结构体变量占用内存大小?
lnabc
2005-07-18 02:05:58
struct teacher
{
int num;
char name[20];
char sex;
ing age;
char dept[30];
}
struct teacher teacher1,tezcher2;
sizeof(类型名) 如何表示?
sizeof(变量名)是sizeof(teacher)吗?
...全文
1169
11
打赏
收藏
结构体变量占用内存大小?
struct teacher { int num; char name[20]; char sex; ing age; char dept[30]; } struct teacher teacher1,tezcher2; sizeof(类型名) 如何表示? sizeof(变量名)是sizeof(teacher)吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
oyljerry
2005-07-18
打赏
举报
回复
前两个16,然后加1,然后要整数倍,在填充7个,加起来,24
ChenJF206
2005-07-18
打赏
举报
回复
/Zp8
按照8字节对齐
xuanwenchao
2005-07-18
打赏
举报
回复
VC的编译器真是怪,就算是自动对齐下面的(sizeof(BYTETEST1))也不应该是24啊!
struct BYTETEST1
{
int c;
double a;
char b;
};
youhaodeyi
2005-07-18
打赏
举报
回复
可是如果结构里面有很多类型的变量,那么发给char*后,cout<<,会输出什么结果呢?
antijpn
2005-07-18
打赏
举报
回复
自己用了一下,发现C++也没办法这么干……
megaboy
2005-07-18
打赏
举报
回复
这不是把结构转换为char*类型,结构本身并没有转换,只不过是把结构的地址转换为字符类型并赋予b而已。
这样做的目的,要看程序的作者想做什么。也许作者是想直接通过b求得A.data的值,这是因为第一个成员就是一个字符变量,直接*b就是A.data的值了。
antijpn
2005-07-18
打赏
举报
回复
很好奇,如果有这样一个结构
struct A
{
int i;
};
不产生A类型的变量,怎么获得i的大小?不要用乱七八糟的trick……
C++里面可以用::,C呢?
youhaodeyi
2005-07-18
打赏
举报
回复
那把结构转换为char*类型有什么用?
如:
typedef struct a{
char data;
char no;
int m_a;
}a;
main()
{
char * b;
a A;
b=(char*)&A;
}
把类型转换成了char*类型
megaboy
2005-07-18
打赏
举报
回复
sizeof(类型名) 如何表示? //sizeof(struct teacher)
sizeof(变量名)是sizeof(teacher)吗? //不是sizeof(teacher),而是sizeof(teacher1),teacher
不是变量名,只是个结构标记。
AntonlioX
2005-07-18
打赏
举报
回复
sizeof使用介绍
本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。
1、 sizeof应用在结构上的情况
请看下面的结构:
struct MyStruct
{
double dda1;
char dda;
int type
};
对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗?
其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。
类型
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char
偏移量必须为sizeof(char)即1的倍数
int
偏移量必须为sizeof(int)即4的倍数
float
偏移量必须为sizeof(float)即4的倍数
double
偏移量必须为sizeof(double)即8的倍数
Short
偏移量必须为sizeof(short)即2的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
下面用前面的例子来说明VC到底怎么样来存放结构的。
struct MyStruct
{
double dda1;
char dda;
int type
};
为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。
下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:
struct MyStruct
{
char dda;
double dda1;
int type
};
这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)为24。结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。(简单说明)
struct MyStruct
{
char dda;//偏移量为0,满足对齐方式,dda占用1个字节;
double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8
//的倍数,需要补足7个字节才能使偏移量变为8(满足对齐
//方式),因此VC自动填充7个字节,dda1存放在偏移量为8
//的地址上,它占用8个字节。
int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍
//数,满足int的对齐方式,所以不需要VC自动填充,type存
//放在偏移量为16的地址上,它占用4个字节。
};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构
//的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof
//(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为
//sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。
VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。
VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;
否则必须为n的倍数。下面举例说明其用法。
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢复对齐状态
以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。(请读者自己分析)
2、 sizeof用法总结
在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。
A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。
B. 参数为数组或指针。下面举例说明.
int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小
int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针
//的大小,在32位系统中,当然是占4个字节。
C. 参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。
第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一
个实例在内存中都有唯一的地址。
下面举例说明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s为一个指针。
Class test1{ };//sizeof(test1)=1;
D. 参数为其他。下面举例说明。
int func(char s[5]);
{
cout<
//数的参数在传递的时候系统处理为一个指针,所
//以sizeof(s)实际上为求指针的大小。
return 1;
}
sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于
//求sizeof(int).
以上为sizeof的基本用法,在实际的使用中要注意分析VC的分配变量的分配策略,这样的话可以避免一些错误。
qfeng_zhao
2005-07-18
打赏
举报
回复
sizeof(teacher); //类型名
sizeof(teacher1.name); //变量名
sizeof(teacher1);
likenow#blog#2020-7-14-理解C
结构体
字节对齐与
占用
内存大小
1
写在前面的话最近有被问到:
结构体
怎么写
占用
内存小?很惭愧,当时没答到点子上 ~~呜呜呜
结构体
占用
内存计算
结构体
中同样的
变量
个数,却可能导致
占用
内存的大小不同。直
一文搞懂
结构体
变量
占用
多大内存空间(详细)
请问下面定义的
结构体
变量
aa在计算机内存中
占用
多少字节? #include main() { struct student { float height; short int age ; char sex ; }aa; printf("%d\n",sizeof(aa)); //屏幕上将显示多少? } 错误解答:...
《C语言基础》 之 第10章
结构体
课程内容:为什么需要
结构体
、定义一个
结构体
类型、
结构体
变量
的声明和定义、sizeof测试
结构体
变量
字节、
结构体
成员的普通访问方式、使用指针访问
结构体
成员、
结构体
嵌套、
结构体
传参、
结构体
数组。
结构体
变量
的内存分配(
结构体
的大小)
结构体
变量
的内存分配(
结构体
的大小)
C语言中
结构体
占用
内存大小
这个问题很经典,很容易出现,也叫内存的4k对齐吧 相关知识: cpu传输数据的方式: cpu每次传输数据大小由它的总线条数决定,32位传输4个字节,64位传输8个字节。 这里以64位系统举例,若声明一个
变量
大小为8...
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章