关于sizeof运算符的使用和注意事项,这篇http://hi.baidu.com/xung/blog/item/14267827c0f42c06918f9d04.html有比较好的说明,可以看下。
sizeof最主要的用途是计算大小,以避免代码中出现一些写死的机器相关的值。另外它还是一个很神奇的运算符,由于它并不会真正执行表达式而仅仅返回大小的特性,你可以做一些很棒的事。
看一个例子,它来自LOKI库:
Typelist要管理一堆Type,某些操作需要知道其中两个Type的继承关系,如何用代码做到?
简化一下,假定有两个类型A、B,我们只解决B是否继承自A(相反的问题可以用同样方法解决)
由于派生类的指针可以转型成基类指针,我们利用这点,先声明一个函数Test(只是声明)
Small Test( A* );
Big Test( ... ); // 特殊语法接受任意类型
// Small/Big定义,大小不一样
class Small { char dummy[1] };
class Big { char dummy[2] };
对Test传B对象的指针,如果返回Small那就是继承,否则就不是继承;和sizeof一起使用
bool fInherit = sizeof( Test( new B ) ) == sizeof( Small );
由于sizeof并不真正执行Test函数,所以你不需要实现它;new B也没有真正执行,所以B的构造函数都可以不实现。
sizeof( Test( new B ) ) == sizeof( Small )在编译器就会被计算出来,为true或false,神奇吧!
但这里还有一个潜在问题,B的构造函数可能是私有的,如果那样就编译不过了,怎么办?
没事,再声明个函数
B* GetB();
bool fInherit = sizeof( Test( GetB() ) ) == sizeof( Small );
同样不需要实现它,现在一切OK了。