结构体的空间大小计算。

运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。    C语言中的构造数据类型有三种:数组、结构体和共用体。数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的一个结构体:       struct stu1       {       int    i;       char c;       int j;       };先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4+1),其值为5。实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)二、结构体大小必须是所有成员大小的整数倍。对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。再看一个满足第一条,不满足第二条的情况struct stu2       {       int   k;       short t;};成员k的偏移量为0;成员t的偏移量为4,都不需要调整。但计算出来的大小为6,显然不是成员k大小的整数倍。因此,编译器会在成员t后面补上2个字节,使得结构体的大小变成8从而满足第二个要求。由此可见,大家在定义结构体类型时需要考虑到字节对齐的情况,不同的顺序会影响到结构体的大小。对比下面两种定义顺序struct stu3                              struct stu4{                                      { char c1;                               char c1; int i;                                  char c2; char c2;                               int   i;}                                      }虽然结构体stu3和stu4中成员都一样,但sizeof(struct stu3)的值为12而sizeof(struct stu4)的值为8。如果结构体中的成员又是另外一种结构体类型时应该怎么计算呢?只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。看下面的例子,struct temp       {       short i;    +1       struct       {          char c;  +5          int j;   +6       } ss;       +10+2          int k;   +4};             =16结构体temp的成员ss.c的偏移量应该是4,而不是2。整个结构体大小应该是16。注意在linux下时,整个结构体的大小应该是:char对齐模数是1,short是2,int是4,float是4,double(linux是4,windows是8)所以对于如下的结构体:(32位机,默认设置)struct temp {        int   i;               double  j;    };对于在WINDOWNS系统下,整个结构的大小应该是16,在LINUX系统下,整个结构的大小应该是12

当控制结构的成员封装到内存并为模块中的所有结构指定相同的封装时。#pragma pack(n)   是把所有的成员的对齐模数都设置为n,比如设置为1后,就是一个一个的挨着存放,结构大小也就是成员大小之和了。n必须小于默认的对齐模数,也就是说只能向小设,不能向大设
时间: 2024-11-05 16:08:37

结构体的空间大小计算。的相关文章

结构体变量的sizeof计算

结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: 3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节. 4. 在嵌套结构中需要把内部‘打散'后再进行对齐计算. // sizeof(结构体).cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #inc

C语言结构体占用空间内存大小解析

结构体的数据类型的有点我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧. 格式一: [cpp] view plain copy 01.struct tagPhone 02.{ 03.     char   A; 04.     int    B; 05.     short  C; 06.}Phone; [cpp] view plain copy 格式二: [cpp] view plain copy 01.struct tagPhone 02.{ 03.     char   A; 04

【C++】字节对齐,也就是一个结构体的实际大小

字节对齐是面试笔试经常考到的一个知识点 计算一个结构体大小只需要进行如下几个步骤即可. 1.确认结构体中所有成员的长度大小 可以引用此表. char short int long float double long long long double Win-32 长度 1 2 4 4 4 8 8 8 模数 1 2 4 4 4 8 8 8 Linux-32 长度 1 2 4 4 4 8 8 12 模数 1 2 4 4 4 4 4 4 Linux-64 长度 1 2 4 8 4 8 8 16 2.确

sizeof操作符-结构体与类大小

导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2. sizeof作用于结构体 3. 字节对齐问题 4. sizeof作用于类 正文 1. sizeof与strlen的区别 这是老生常谈的问题了,下面举一个例子大家就明白了. char buf[] = "hello world!"; cout<<sizeof(buf)<&

文件内存空间大小计算

/** *  要求计算一个文件中所有文件的大小 注意:必须先计算一个文件夹中所有文件的大小必须先拿到所有文件,然后再获取所有文件的大小,然后相加 */ NSFileManager *manager=[NSFileManager defaultManager]; //提取要求计算的文件 NSArray *arr=[manager subpathsAtPath:@"/Users/zhangyunjiang/Desktop"]; NSMutableString *strM=[NSMutabl

c++类占内存空间大小计算

x64环境下实现: 1 #include <iostream> 2 3 using namespace std; 4 5 class kong{ 6 7 }; 8 9 class kong1{ 10 11 }; 12 13 class kong2{ 14 15 }; 16 17 class data2 18 { 19 int a; //4个字节 20 char s; 21 }; 22 23 class data3 24 { 25 int a; 26 char s; 27 virtual voi

[转]sizeof计算空间大小的总结

原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof var_name 2.变量名可以不用括号括住:sizeof a 3.数据类型必须用括号括起来:sizeof(int) 4.sizeof可以对表达式求值:sizeof(2+3.14),实际是sizeof(double) 5.sizeof可以对函数调用求值,实际上是对返回值类型求值 6.以下情况不能用

C++中的空类与空结构体大小

今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { }; int main() { std::cout << sizeof S0 << std::endl; return 0; } 面试官当场提醒了我一下,说如果S0对象所占用的内存大小为0,那么将可以申请无限多个此类型的对象数组,并且大小永远为0.我当时觉得有点道理,不过转念一想,还是有点疑惑. 回来研究了一下,原来

C++中类的内存空间大小(sizeof)分析

首先明确各数据类型占多大的空间.例如int到底是占2字节还是4字节空间: 在TC里,int是2字节的(主要是因为TC是16位的,所以int类型也该是16位的)VC++里,int是4字节的,因为现代操作系统下的软件大多是是32位.64位的VC++,本来按理说,该是8字节的,但是可能为了维持32位的源代码移植到64位尽量不出错,所以也维持了4字节的长度.至于其他有名的编译器,如gcc,我还没用过,你得查一查它所规定int的长度 或者利用sizeof(int)也可以计算出来.本人电脑上计算如下: 在C