`
mx19841031
  • 浏览: 74647 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

sizeof用法总结

阅读更多

 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);//这里将输出4,本来s为一个数组,但由于做为函

                     //数的参数在传递的时候系统处理为一个指针,所

                     //以sizeof(s)实际上为求指针的大小。

     return 1;

}

sizeof(func("1234"))=4//因为func的返回类型为int,所以相当于

                     //求sizeof(int).

 

以上为sizeof的基本用法,在实际的使用中要注意分析VC的分配变量的分配策略,这样的话可以避免一些

错误。

5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象

的总字节数,包括任何垫补在内。 

  让我们看如下结构: 

  struct {char b; double x;} a; 

  在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 

  这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型

的结构成员x要放在被4整除的地址。

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用法

    这个是一段关于sizeof的用法总结,现在拿过来和大家分享一下

    sizeof()里面的值

    对c语言中sizeof进行总结!!sizeof的概念 sizeof的使用方法 、sizeof的结果 sizeof与其他操作符的关系

    有关strlen和sizeof的归纳与总结

    都是在网上下载资料,然后自己整理而成。详细的介绍了strlen和sizeof的区别和用法,这在应用程序是,有很高的帮助。

    深入详解sizeof

    本篇文章细心总结了sizeof的各种用法,讲述了来龙去脉,值得细心研读。

    C语言中sizeof函数的基本使用总结

    C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。  sizeof是什么 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–...

    c++ 面试题 总结

    段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一...

    Sizeof简介

    本文主要包括二个部分,第一部分重点介绍在 VC中,怎么样采用 sizeof 来求 结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出 VC中sizeof 的主要用法。

    C# 使用方法 入门教程

    1.9 小结...... 22 第2章 C#基础.... 23 2.1 引言...... 23 2.2 第一个C#程序...... 23 2.2.1 代码..... 24 2.2.2 编译并运行程序..... 24 2.2.3 详细介绍..... 25 2.3 变量........ 27 2.3.1 变量的初始化..... 27 ...

    C语言中qsort函数用法实例小结

    本文实例汇总了C语言中qsort函数的常见用法,非常具有实用价值。分享给大家供大家参考。具体分析如下: C语言中的qsort函数包含在的头文件里,本文中排序都是采用的从小到大排序。 一、对int类型数组排序 int num...

    嵌入式C语言开发总结文档

    程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。...不用库函数实现字符串的拷贝,比较,返回字符串的长度,sizeof的用法,static等关键字的用法和注意事项。

    C学习深入学习总结

    9.3 数组和指针有千丝万缕的联系而又不同,你是否对他们在不同情况下的使用进行过详细的总结? 12 9.4 “int calendar[10][20]; ”,这是一个什么样的数组?它拥有 10 数组类型的元素,还是 20 个? 12 9.5 “int a...

    Vivado HLS 视频课程总结

    5.2 sizeof()函数使用 16 5.3 设置Visual Studio支持任意精度数据类型 17 6 数组类型转换 17 6.1 变量的定义和初始化 17 6.2 定点数据类型 18 6.3 浮点数据类型的定义和初始化 19 6.4 隐式数据类型转换 19 6.5 显示...

    C语言面试总结

    1.6 assert用法 1.7 itoa函数和atoi函数 1.8 strcmp函数实现 1.9 strcpy函数实现 1.10 memcpy函数实现 1.11 memcpy和memmove函数的实现 1.12 strcat函数实现 1.13 使用库函数atoi,将char *→int 1.14 使用库函数...

    23道常见的C语言面试题

    文档内容涵盖了const关键字的使用、指针常量与常量指针的区别、static...sizeof与strlen运算符的差异、条件变量的使用、指针的基本概念和用法、动态内存分配的方法、结构体的定义和使用、指针数组的定义和使用、静态...

    c/c++ 学习总结 初学者必备

    1、sizeof()和strlen()的使用? 答: 1.从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的 大小; 2.sizeof是运算符,而strlen是C库函数strlen只能用char*做参数,且...

    定时器的用法的心得体会

    使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。 然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。 响应方式如下: void CTimeDlg::OnTimer(UINT ...

Global site tag (gtag.js) - Google Analytics