sizeof运算符详解及对象大小

sizeof 是运算符,而不是函数。虽然我们习惯sizeof(...),但( )并不是必需的,它只是表示优先级。我们把sizeof后面的目标叫对象或者操作数。本文约定就叫sizeof对象。


  1. 当sizeof 的对象是表达式时,求的大小是表达式返回值的类型大小,但并不计算表达式的值

  2. 同样如果对象是函数,则返回函数返回值类型大小,也不执行函数体

  3. 注意sizeof 对象是指针和数组的区别。

    当sizeof的对象是数组时,返回数组总大小,而当对象是指针时,返回指针本身的大小,而不是指示内存空间的大小;

    但注意:当数组名作为实参传入函数时,会自动转化为指针类型;但并不影响形参的类型;

  4. sizeof 无法获取动态分配的内存大小,即使用malloc动态的分配内存,无法使用sizeof获取其大小。

  5. 关于结构体类型

    理论上一个结构体所占空间是所有成员的大小总和,但由于考虑到对齐问题,会有填充字节。

    一、结构体默认按自然对界对齐;

    二、#pragma pack(n)规定的对齐长度,实际使用的规则是:
        1)结构,联合,或者类的数据成员第一个放在偏移为0的地方,以后每个数据成员的对齐,起始位置必须是对齐模数的整数倍。对齐模数是#pragma pack指定的数值和数据成员的
    长度中比较小的那个。就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
        2) 结构体的对齐按照结构体中size最大的数据成员和#pragma pack指定值之间,
    较小的那个进行

    eg:pack(4) struct a{int c1; char c2; char c3;}; 大小为8字节    pack(4) struct b{int c1; char c2; int c3;};大小为12字节

  6. 关于类

    空类的大小为1字节;空类型实例中不包含任何信息,应该大小为0. 但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。g++中每个空类型的实例占1字节空间。注意空struct即空类,这就是为什么c++的空struct占一个字节的原因。

    含有虚函数的类要加一个虚表指针的大小,32位系统下为4字节,64位下为8字节;

转载于:https://my.oschina.net/xunxun/blog/264165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值