sizeof运算符

本文最新地址http://exbrowser.com/?p=575

sizeof是一元运算符,用于计算类型或者变量在内存中所占字节数。
通常用于内存分配时求对象大小或者数组元素个数。
例1:

#define ARRAY_SIZE(a)                                   /
  ((sizeof(a) / sizeof(*(a))) /                         /
  static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))

 

上例的宏ARRAY_SIZE是求数组元素个数。

 

1. sizeof结果大于0

例2:
class Empty {};
Empty e;

sizeof(e) = 1

为什么上面的空的类,但是sizeof的结果缺不是0。原因是如果允许sizeof的结果等于0
下面情况可以说明该特例。
例3:
class A {};

class B {
    A m_a;
    i m_b;
};

如果sizeof(A)=0,则B实例的成员m_a的地址会和m_b的地址重叠。

2.sizeof结果是类型经过内存对齐后的结果

例4:
struct A {
    short s;
    long  l;
};

sizeof(struct A) = 8 还是 6 ?
如果按照不限制内存填充,则sizeof的结果是8,如果
设置内存对齐值为1,则sizeof的结果是6

这一点在通讯类程序(网络、串口、驱动等)中尤为要注意,因为一般的通讯类
的发送和接收的数据长度都有严格的要求,发送和接收者如果内存对齐设置不一致
会导致同样的负载数据,在发送和接收过程中的实际数据长度不一致。

3.编译器实现相关的类型

bool和wchar_t的sizeof结果是和编译器实现相关的。

4.在模板中的妙用


例5:
template <class Dest, class Source>
inline Dest bit_cast(const Source& source)

{
  // Compile time assertion: sizeof(Dest) == sizeof(Source)
  // A compile error here means your Dest and Source have different sizes.
  typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : -1];

  Dest dest;
  memcpy(&dest, &source, sizeof(dest));
  return dest;
}

上述类型VerifySizesAreEqual定义用于断言是否Dest和Source类型的内存大小一致,如果不一致
则会产生编译错误。

例6:
template <typename T> inline void deleteOwnedPtr(T* ptr)
{
    typedef char known[sizeof(T) ? 1 : -1];
    if (sizeof(known))
        delete ptr;
}

 

此例与例5类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值