关键字sizeof的作用是返回对象或类型占用的内存字节数,返回值是size_t。

基本数据类型占用的字节数:(32位系统)

char 1字节

bool 1字节

short 2字节

int 4字节

long 4字节

float 4字节

double 8字节

对sizeof结果的一个重要影响因素是字节对齐。首先看一个公式:有效对齐值=min(自身对齐值,设置对齐值)。

自身对齐值是一个数据类型自身所占字节数,

例子:

int a;  //自身对齐值是4
char c; //自身对齐值是1
double d; //自身对齐值是8 //对于结构体,自身对齐值是其内置数据类型中对齐值最大的值
struct s1{
int q; //
bool e; //
char w; //
};// 最大的是int q,所以自身对齐值是4 struct s2{
int q; //
bool e; //
double r; //
};// 最大的是double r,所以自身对齐值是8

设置对齐值是编译器默认的对齐值,笔者用的是vs2013,默认对齐值是4字节,可以Project--->Properties--->Configuration Properties--->C\C++--->Code Generation

--->Struct Member Alignment中设置,也可以通过宏#pragma pack(n)来设置,n为要设置的对齐字节。

有效对齐值是对象或类型的自身对齐值和设置对齐值中较小的一个,也是实际真正的对齐值。

在上面的例子上加点改动后:

#pragma pack(4) //设置对齐值为4
struct s1{
int q;
bool e;
char w;
}; //s1的自身对齐值是4,所以s1的有效对齐值=min(4,4)=4 #pragma pack(2) //设置对齐值为2
struct s2{
int q;
bool e;
double r;
}; //s2的自身对齐值是8,所以s2的有效对齐值=min(8,2)=2

知道了有效对齐值就可以轻松地计算sizeof了。

一、基本数据类型的sizeof

sizeof(int)=4

sizeof(double)=8

......

二、结构体的sizeof

#pragma pack(4)
struct s1{
int a;
char b;
}; //有效对齐值是4
sizeof(s1)=
//int a占4字节,储存在0x00--0x03,char b占1字节,储存在0x04,因为有效对齐值是4,所以char b后面的0x05--0x07补齐对齐,一共占用8字节 //把s1稍作改动
struct s1{
char b;
int a;
}; //有效对齐值是4
sizeof(s1)=
//答案一样,但是内部储存情况变了。char b占1字节,储存在0x00,int a占4字节,因为有效对齐值是4,0x01---0x03只剩3字节的内存,小于int a所需的字节数,所以新分配一段4字节(有效对齐值)内存,最终int a储存在0x04---0x07 //再看一个例子
struct s2
{
char a;
short b;
double c;
char d;
}; //有效对齐值是4
sizeof(s2)=
//char a占1字节,储存在0x00;short b占2字节,由于有效对齐值是4,第一段内存剩余3字节0x01---0x03,大于short b所需,所以short b储存在0x02---0x03(注意:储存首地址必须是成员大小的整数倍,所以0x01空出);double c占8字节,大于有效对齐值,所以分配两段内存0x04---0x0B用于储存double c;char d占1字节,储存在0x0C,按有效对齐值4字节对齐,最后的0x0D---0x0F补齐对齐。一共16字节。

三、结构体中含有结构体类型的sizeof

结构体的自身对齐值是其内置类型中最大的一个。

例子:

#pragma pack(2)
class A
{
public:
int a;
double s; }; //A的自身对齐值是double s的自身对齐值,为8
//但A的有效对齐值是min(8,2)=2,sizeof(A)=12
class B
{
public:
char c; //自身对齐值1,占1字节
A b; //自身对齐值8,占sizeof(A)=12字节
}; //B的自身对齐值等于A的自身对齐值,为8
//B的有效对齐值=min(8,2)=2,按2字节对齐
sizeof(B)=
//char c占1字节,储存在0x00,0x01空出;A b占12字节。一共14字节。

四、结构体中含有虚函数的sizeof

带有虚函数的结构体会有一个虚表指针,占4字节大小。

例子:

#pragma pack(4)
Class A
{
public:
int a;
virtual int test();
};
sizeof(A)= //int a占4字节,虚表指针占4字节,一共8字节。
//注意:如果一个结构体有多个虚函数,也还是只有一个虚表指针,即多个虚函数共用一个虚表指针

对于继承的情况,如果基类有虚函数,那么这个虚表指针也会被继承下来,即基类和派生类共用一个虚表指针。

例子:

#pragma pack(4)
class A
{
public:
int a;
double s;
virtual int test();
};
class B:public A
{
public:
virtual int test_1(); //共用基类虚表指针
virtual int test_2(); //共用基类虚表指针
char c; };
sizeof(B)=
//int a占4字节+double s占8字节+虚表指针占4字节+char c占1字节+3字节补齐对齐=20字节

五、联合体的sizeof

联合体中各成员共享内存,整个联合体的sizeof就是每个成员sizeof的最大值。

例子:

union u
{
int a;
double b;
char c;
bool d;
};
sizeof(u)=sizeof(b)=

六、含有static的结构体的sizeof

static和全局变量都是储存在静态存储区,计算结构体的sizeof时只计算非static成员。

例子:

#pragma pack(4)
class A
{
public:
int a;
double b;
static int d; //不管他 };
sizeof(A)= //int a占4字节+double b占8字节=12

七、函数的sizeof

结果是函数返回类型的大小,所以不能对没有返回值的函数求sizeof。

格式sizeof(函数名(实参表))

例子:

int A()
{
return ;
}
sizeof(A())=sizeof(int)= char B(char b)
{
return b;
}
sizeof(B('b'))=sizeof(char)= void C()
{
}
sizeof(C()) //error,因为没有返回类型

有理解错误的地方希望各位大神指正啊!!感激不尽!

C++ sizeof总结的更多相关文章

  1. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  2. c/c++中关于sizeof、strlen的使用说明

    sizeof: 一般指类型.变量等占用的内存大小(由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小) strlen: c字符串的长度(参数必须是字符型指针 char*,当数组名作 ...

  3. sizeof(转载)

    原文地址:http://blog.sina.com.cn/s/blog_5da08c340100bmwu.html 转载至:http://www.cnblogs.com/wangkangluo1/ar ...

  4. C语言中的sizeof()

    sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但当我总结的时候才发现,这个 ...

  5. 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

    一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...

  6. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

    一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...

  7. c语言 sizeof理解

    1.基本数据类型 char :1     short:2   int 4    long 4   long long :8    float:4    double :8字节. 2.数组:对应的基本数 ...

  8. sizeof与strlen的区别

    1 sizeof是操作符,而strlen是库函数: 2 sizeof的参数可以为任意变量或类型,而strlen必须以char*做参数,且字符串必须以‘/0’结尾: 3 数组名用作sizeof参数时不会 ...

  9. sizeof

    一.sizeof使用的场合: 1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信.例如: void* malloc(size_t size); size_t fread(v ...

  10. strlen()和sizeof()求数组长度

    在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...

随机推荐

  1. 初学acm感想

    初学acm,觉得大部分题对我来说都是陌生的,好多类型没见过,好多题没思路,打击确实不小,或许这个阶段正是比较能考验人的时候吧,因为只有坚持下来才有收获,没有人生下来就是大神,所以不能气馁更不能放弃,有 ...

  2. [原]RobotFrameWork(十一)AutoItLibrary测试库在win7(64bit)下安装及简单使用

    最近安装AutoItLibrary,发现在win7 x64下无法安装成功,后来经过定位,发现是3rdPartyTools\AutoIt目录下面AutoItX3.dll的问题.因为AutoItX3.dl ...

  3. Web前端常见问题处理

    1. 浏览器后退按钮 这个在注册或者登陆的时候是一个普遍的问题,登陆之后,跳转到另外一个页面,我的鼠标有两个侧键,是用于前进和后退的,有时候会误点侧键,这个时候页面又会回到之前的登录页面,但事实是用户 ...

  4. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  5. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf3

    路径与子路径 在某一时刻,canvas之中只能有一条路径存在,Canvas规范称之为“当前路径”(current path),这条路径却可以包含很多子路径(subpath),子路径是由两个或者更多点组 ...

  6. 蔡勒(Zeller)公式

    蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几. W =[ [c/4] - 2c + y + [y/4] + [13 * (m+1) / 5] + d - ...

  7. C#.net 创建XML

    方法一:按照XML的结构一步一步的构建XML文档.    通过.Net FrameWork SDK中的命名空间"System.Xml"中封装的各种类来实现的 方法二:直接定影XML ...

  8. "http-8080-3" java.lang.OutOfMemoryError: PermGen space C3P0死锁的问题

    Exception in thread ""http-bio-8080"-exec-1" java.lang.OutOfMemoryError: PermGen ...

  9. jmeter参数化数据(_csvread函数、用户自定义变量等)

    以下是转载内容,仔细看过后,觉得用得最多的应该是csvread函数.用户自定义变量以及CSV DATA CONFIG控制器这几个,但是做练习之后,在结果树和聚合报告中怎么查看执行结果是个问题,没找到对 ...

  10. Sublime_text3怎么运行php代码

    开发神奇sublime写代码真的好爽,之前听说是神器,但是没去用,觉得用eclipse写php代码,用dw写html够用了,用了一下sublime,哈哈,爽爆了. 除了写前端代码外,还需要写php代码 ...