sizeof 转载
[ 2006-11-27 15:09:00 | By: Kision ]
sizeof 转载
关键字:sizeof,字节对齐,多继承,虚拟
继承,成员函数指针
前向声明:
sizeof,一个其貌不扬的家伙,引无数菜鸟
竟折腰,小虾我当初也没少犯迷糊,秉着
“辛苦我一个,幸福千万人”的伟大思想,我
决定将其尽可能详细的总结一下。
但当我总结的时候才发现,这个问题既可
以简单,又可以复杂,所以本文有的地方
并不适合初学者,甚至都没有必要大作文
章。但如果你想“知其然,更知其所以然”的
话,
那么这篇文章对你或许有所帮助。
菜鸟我对 C++的掌握尚未深入,其中不乏
错误,欢迎各位指正啊
1. 定义:
sizeof 是何方神圣 sizeof 乃 C/C++中的一个
操作符(operator)是也,简单的说其作用
就是返回一个对象或者类型所占的内存字
节数。
MSDN 上的解释为:
The sizeof keyword gives the amount of
storage, in bytes, associated with a
variable or a type (including aggregate types).
This keyword returns a value of type size_t.
其返回值类型为 size_t,在头文件 stddef.h
中定义。这是一个依赖于编译系统的值,
一般定义为 typedef unsigned int size_t; 世上
编译器林林总总,但作为一个规范,它们
都会保证
char 、 signed char
和
unsigned char
的
sizeof
值为
1 ,毕竟
char
是我们编程能用
的最小数据类型。【保留意见,一个 char
在 ASCII 中是占 1 个字节!】
2. 语法:
sizeof 有三种语法形式,如下:
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // sizeof( 类型 );
3) sizeof object; // sizeof 对象;
所以,
int i;
sizeof( i ); // ok
sizeof i; // ok
sizeof( int ); // ok
sizeof int; // error
既然写法 3 可以用写法 1 代替,为求形式统
一以及减少我们大脑的负担,第 3 种写法,
忘掉它吧!
实际上,sizeof 计算对象的大小也是转换成
对对象类型的计算,也就是说,同种类型
的不同对象其 sizeof 值都是一致的。这里,
对象可以进一步延伸至表达式,即 sizeof 可
以对一个表达式求值,编译器根据表达式
的最终结果类型来确定大小,一般不会对
表达式
进行计算。如:
sizeof( 2 );// 2 的类型为 int ,所以等价于
sizeof( int );
sizeof( 2 + 3.14 ); // 3.14 的类型为 double,2
也会被提升成 double 类型,所以等价于
sizeof( double );sizeof 也可以对一个函数调
用求值,其结果是函数返回类型的大小,
函数并不会被调用【但前提是函数不能返
回值为空!】,我们来看一个完整的例子:
char foo()
{
printf("foo() has been called.\n");
return 'a';
}
int main()
{
size_t sz = sizeof( foo() ); // foo() 的返回值类
型为 char,所以 sz = sizeof(
char ),foo()并不会被调用
printf("sizeof( foo() ) = %d\n", sz);
}
C99 标准规定,函数、不能确定类型的表达
式以及位 域(bit-field )成员不能被计算
sizeof 值,即下面这些写法都是错误的:
sizeof( foo );// error
void foo2() { }
sizeof( foo2() );// error
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );// error
3. sizeof 的常量性
sizeof 的计算发生在编译时刻,所以它可以
被当作常量表达式使用,如:
char ary[ sizeof( int ) * 10 ]; // ok
最新的 C99 标准规定 sizeof 也可以在运行时
刻进行计算,如下面的程序在 Dev-C++中
可以
正确执行:
int n;
n = 10; // n 动态赋值
char ary[n]; // C99 也支持数组的动态定义
printf("%d\n", sizeof(ary)); // ok. 输出 10
但在没有完全实现 C99 标准的编译器中就
行不通了,上面的代码在 VC6 中就通不过
评论0