sizeof用法总结

来源:互联网 发布:网络大电影数据 编辑:程序博客网 时间:2024/05/08 07:02
 

  在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。

A.参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。

B. 参数为数组或指针。下面举例说明.

int dest[50]; //sizeof(dest)=4*50=200; 求数组所占的空间大小

int *pstr=new int[50];// sizeof(pstr)=4; pstr为一个指针,sizeof(pstr)是求指针

            //的大小,在32位系统中,当然是占4个字节。
c.参数为数组引用。下面举例说明
int func(char (&s)[5]);
{

  cout<<sizeof(s);//这里将输出5,这里的s为数组引用。此时编译器不会将数组实参转换为指针,而是传递数组的引用本身。
  return 1;
}
d.参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。(对于这个问题必须的懂VC内存对齐)。 但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。

第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一

个实例在内存中都有唯一的地址。

下面举例说明,

Class Test{int a;static double c};//sizeof(Test)=4.

Test *ps;//sizeof(ps)=4,ps为一个指针。

Class Test1{ };//sizeof(test1)=1;

e.参数为其他。下面举例说明。

  int func(char s[5]);

  {

  cout<<sizeof(s);//这里将输出4,本来s为一个数组,但由于做为函

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

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

  return 1;

}

补充:
1.
#include<iostream>
using namespace std;

int func(char s[5])
{
 cout<<sizeof(s)<<endl;
 return 0;
}

int main()
{
 char a[5]="oioi";
 func(a);
 return 0;
}
sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于

              //求sizeof(int).

 

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


2.
对于Ctest这个类,在32位机器、4字节对齐的情况下,sizeof(Ctest)= ?

class Ctest
{

  public:
      Ctest();
      virtual ~Ctest();
  private:
      int m_iTime;
}

A、4 B、8 C、12 D、16

 

是8。
一个m_iTime的大小为4,再加上由于虚函数产生的指针数组大小也为4,所以加起来是8

"int m_iTime"是定义一个整形变量,而int型变量在4字节对齐的环境中是占4个字节。“4字节对齐”的意思就是指在改环境中定义的变量肯定能被4整除。而为什么是8,本块中有相关解释,我这里再罗嗦一遍,呵呵,当类中定义有虚函数时,编译程序会自动向类中增加一个指向函数指针表的指针,m_iTime占4个字节,指针也占4个字节,加起来就是8个了 。 

原创粉丝点击