sizeof 精要

原创 2012年03月29日 08:33:39

要理解 sizeof 的要点,首先要明白字节对齐。

一. 字节对齐

但一般而言,满足以下两点个:
1) 结构体每个成员相对于结构体首地址的偏移量都是本成员大小的整数倍,如不满足则加上填充字节;
2) 结构体的总大小为结构体最宽的基本类型成员大小的整数倍,如不满足则在最后加上填充字;

struct A {
	int a;
	char b;
	short c;
};

struct B {
	char b;
	int a;
	short c;
};

int main()  
{  
    A aa = {0xffffffff, 0x11, 0xffff};

    B bb = {0x11, 0xffffffff, 0xffff};

    int xx = sizeof(aa);
    int yy = sizeof(bb);

    return 0;  
}  

分析A:

首先第一个 int 为 4 。----

其次 char 为 1,char 成员相对于首地址的偏移量为4, 4是char 本身大小 1 的整数倍,所以可以接着安置。-----

然后 short 为2,short 成员相对于首地址的偏移量为5,5不是short 本身大小 2 的整数倍,所以在填充到6。-----X--

最后计算总大小,int 4+char 1+填充 1+ short 2 = 8,8是最宽int 4 的整数倍。所以后面不再填充。

调试结果如下:

分析B:

首先第一个 char为 1 。-

其次 int 为 4,int 成员相对于首地址的偏移量为 1, 1显然不是 int 本身大小 4 的整数倍,所以要填充到4。-XXX

然后 short 为2,short 成员相对于首地址的偏移量为 8,8 是short 本身大小 2 的整数倍,所以不需要填充。-XXX------

最后计算总大小,char 1 + 填充 3 + int 4 +  short 2 = 10,10不是最宽 int 4 的整数倍。所以后面还要再填充到12。-XXX-----XX

调试结果如下:



二. sizeof 相关

1. sizeof 计算字符串长度

char str1[20] = "0123456789";
char str2[] = "0123456789";

int a = sizeof(str1); //20
int b = sizeof(str2); //11, 注意要还要加上 '\0'

int c = strlen(str1); //10, 注意 strlen 参数只能是char*, 且必须以'\0'结尾
计算字符串时,sizeof 要计算 '\0';而strlen 不计算'\0'

2. sizeof 计算含有虚函数的类对象大小

class A
{
public:
    A(int x):a(x) {}

    virtual void print()
    {
      cout << "A" << endl;
    }

private:
    int a;
};

class B:public A
{
public:
    B(int x):A(x-1),b(x)
    {}

    virtual void print()
    {
      cout << "B" << endl;
    }

private:
    int b;
};

sizeof(A) == 8; // int 4 + 虚表指针 4 = 8
sizeof(B) == 12; // int 4 + int 4 + 虚表指针 4 = 12
可以看出,含虚函数(不管含多少个虚函数)的类,会只有一个虚表指针。普通的成员函数不占用字节。

3. sizeof 计算含静态成员的类大小

class A
{
public:
    int a;
    static int b;
};
int A:b = 10;

sizeof(A) == 4; //只计算 int a
静态成员的空间不在类的实例中,而是像全局变量一样在静态存储区中,被类共享,所在不计算在内。

4. sizeof 计算联合体大小

uniton u1
{
    double a;
    int b;
};

uniton u2
{
    char a[13];
    int b;
};

sizeof(u1) == 8;  //联合体大小取所有成员中最大的一个成员的大小

sizeof(u2) == 16; //最大成员为13,但要按 int 的对齐方式(也就是要能整除 int) 
计算联合体时,取最大的成员,但也要考虑字节对齐。

5. sizeof 其它方面
基本数据类型,char 1, shour 2, int 4, double 8, 指针 4
函数参数,看成指针 4

成员函数的重载、覆盖与隐藏

    成员函数的重载(overloaded)、覆盖(override)与隐藏很容易混淆, C++程序员必须要搞清楚概念,否则错误将防不胜防。 1. 重载与覆盖  成员函数被重载 的特征:(1)相...

C++ 总结

C++ 虽然内容比较多,但是细分下来,可有几大部分组成,每一部分侧重点不同,我在学习过程中按这几大块来理解,发现很有效率,故总结如下。 一、基本语言 C/C++ 声明与定义 C++类型转...

程序员面试精要-C/C++程序设计-预处理/const/sizeof(面试宝典读书笔记)

宏定义 1.宏定义展开容易造成二义性问题 #define SQR(x) (x*x) a =SQR(b+2)展开后为b+2*b+2而不是”(b+2)*(b+2)” 若要平方形式对表达式适用,可以...

sizeof和strlen的区别

  • 2014年11月27日 23:41
  • 29KB
  • 下载

sizeof用法

  • 2013年09月06日 14:06
  • 108KB
  • 下载

Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果

建立一个基本的屏幕后处理脚本系统 屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。使用这种技术,可以为游戏画面添加更多艺术效果,例如景深、...

Sizeof与Strlen的区别与联系

  • 2012年08月08日 22:37
  • 17KB
  • 下载

sizeof函数使用注意事项

  • 2011年05月16日 12:23
  • 14KB
  • 下载

4-C++多线程系统编程精要

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1Welcome to my github: https://github...

sizeof of everything

  • 2010年09月27日 19:01
  • 12KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sizeof 精要
举报原因:
原因补充:

(最多只允许输入30个字)