本文最新地址: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类似。