关键字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;    //4bool e;    //1char w;   //1
};// 最大的是int q,所以自身对齐值是4struct s2{int q;    //4bool e;    //1double r;   //8
};// 最大的是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)=8
//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)=8
//答案一样,但是内部储存情况变了。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)=16
//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)=14
//char c占1字节,储存在0x00,0x01空出;A b占12字节。一共14字节。

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

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

例子:

#pragma pack(4)
Class A
{public:int a;virtual int test();
};
sizeof(A)=8  //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)=20
//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)=8

六、含有static的结构体的sizeof

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

例子:

#pragma pack(4)
class A
{
public:int a;double b;static int d; //不管他

};
sizeof(A)=12  //int a占4字节+double b占8字节=12

七、函数的sizeof

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

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

例子:

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

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

转载于:https://www.cnblogs.com/zjc0202/p/4409939.html

C++ sizeof总结相关推荐

  1. C++ sizeof 运算符的使用

    sizeof  是C++ 中 唯一的一个带字母的运算符, sizeof 的功能: 返回指定的数据类型或者表达式值的数据类型在内存中所占的字节数. sizeof  运算符的使用 1 sizeof(类型) ...

  2. C++ 笔记(04)— 数据类型(各类型占用内存 sizeof、typedef 声明)

    编程语言中变量保存的是它所存储值的内存位置.也就是说在创建一个变量时,就会在内存中开辟一些空间.操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么. 1. 基本数据类型 类型 关键字 ...

  3. [C++对象模型][6]sizeof与对象内存布局

    有了前面几节的铺垫,本节开始摸索C++的对象的内存布局,平台为windows32位+VS2008. 一 内置类型的size 内置类型,直接上代码,帮助大家加深记忆: Code void TestBas ...

  4. c语言求占用内存sizeof,C语言中sizeof的用法

    定义: sizeof是神圣的sizeof,它是C / C ++中的运算符. 简而言之,其功能是返回对象或类型占用的内存字节数. MSDN上的解释是: sizeofkeyword给出字节,关联的类型(包 ...

  5. C语言的sizeof和strlen

    strlen是函数,而sizeof是算符.strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用已知字符串进行了初始化,起长度是固定的,所以sizeof在编译时计算缓冲区的长度. ...

  6. 解析C语言中的sizeof

    一.sizeof的概念  sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内 ...

  7. sizeof 操作符详解

    1. 定义: sizeof是何方神圣? sizeof 乃 C/C++ 中的一个操作符(operator)是也.简单说其作用就是返回一个对象或者类型所占的内存字节数. MSDN上的解释为: The si ...

  8. cpp中sizeof与指针

    一直不清楚c++的sizeof,现在通过实验得到了一些了解. 1 #include<iostream> 2 3 using namespace std; 4 5 class A{ 6 pr ...

  9. 比较分析与数组相关的sizeof和strlen

    // 形如: int a[]={1,2,3,4,5}; char name[]="abcdef"; 无论是整型数组还是字符数组,数组名作为右值的时候都代表数组首元素的首地址. 数组 ...

  10. 【基础复习】二:预处理、const与sizeof

    赋值语句 1.i的值为? #include <iostream> using namespace std; int i = 1; int main() {int i = i; } 解析: ...

最新文章

  1. 并查集hdu1232
  2. 30岁自学python找工作-程序员自学Python开发,20到30岁几乎决定了你的未来!
  3. HTTPS访问站点,出现证书问题解决
  4. Spring AOP 源码分析 - 拦截器链的执行过程
  5. Linux系统调用及其效率
  6. Netty防止内存泄漏措施
  7. python职场应用_大学粗略学习过Python,在进入职场后如何进一步学习Python
  8. js时间戳转成日期格式
  9. SkyWalking学习笔记(CentOS环境)
  10. Linux命令之文件相关
  11. 小胖说事30------iOS 强制转成横屏的方式
  12. 矩池云上安装CUDA头文件教程
  13. 最新emoji表情代码大全_2020最新版早上好问候图片大全 表情
  14. 泊松分布 二项分布 正态分布之间的联系,与绘制高斯分布图
  15. minimax算法和Alpha-Beta pruning实现英式跳棋
  16. 一天一个 Linux 命令(27):mkfs 命令
  17. kafka报错:The Cluster ID doesn‘t match stored clusterId Some in meta.properties
  18. win10 加ip地址映射
  19. 异常java.io.NotSerializableException
  20. 你知道的版心和你不知道的版心

热门文章

  1. J2ME手游开发日记
  2. 【实施工程师】ARP——地址解析协议(高清版本)
  3. centos7安装sftp服务器
  4. Oracle顶级认证OCM考试实战总结
  5. 从域环境搭建到域渗透
  6. 用户 NT AUTHORITY\NETWORK SERVICE 登录失败解决方法
  7. python中的魔法参数:*args和**kwargs
  8. HTML5 required是必填
  9. Native与H5交互的一些解决方法
  10. DeprecationWarning: the md5 module is deprecated; use hashlib instead import md5的解决办法