标签:
sizeof()是C语言的一种单目运算符,它并不是函数。
1 作用:
以字节形式给出sizeof操作数的存储大小。操作数可以是一个表达式、基础类型、结构体、类类型等。
2 特点:
sizeof 是一个单目运算符,用于计算操作数的存储大小,在编译阶段就已经求值。
看如下代码
int a = 0; int nSize1 = sizeof(a = 3); cout << nSize1 << endl; cout << a << endl;
若不清楚其中的原理,很多人会以为程序输出4和3,其实不然,正确答案是4 和 0.下面分析其原因。
图1 机器码
从图1可以看出,sizeof作用于编译阶段特性,在sizeof作用范围内,()内的内容也不能被编译,而是并替换成类型,直接给出操作数大小,这里是int类型,即4个字节。
其等价代码如下:
int a = 4; int nSize1 = 4; cout << nSize1 << endl; cout << a << endl;
格式:sizeof(type) 数据类型必须要用括号括住,如下示例:
int n = sizeof(int);
格式:sizeof(var_name) 或者sizeof var_name, 如下示例:
int a ; cout << sizeof(a)<< endl; cout << sizeof a <<endl;
备注: 带括号的更常用
当操作数是指针时,sizeof依赖于编译器, 32位操作系统都是占4个字节,如下示例:
<pre name="code" class="cpp"> class A { public: A():m_a(0),m_b(0),m_c(0){} A(int a, int b, int c):m_a(a),m_b(b),m_c(c){} void output() { cout << m_a << m_b << m_c <<endl; } private: int m_a; int m_b; int m_c; }; A *pA = new A(1,2,3); char szName[20] = "hello world"; char * ptr = szName; cout << sizeof(pA) << endl; //4字节 cout << sizeof(ptr)<< endl; //4字节 cout << sizeof(szName) <<endl; //20字节
当操作数具有数组类型是,其结果是数组的总字节数,如下示例:
char szName[20] = "hello world"; char * ptr = szName; cout << sizeof(ptr)<< endl; //4字节 cout << sizeof(szName) <<endl; //20字节,数组名代表整个数组
memset(szName, 0, sizeof(char)*20) //健壮性好 memset(szName, 0, sizeof(szName)) //当szName变量被改成new方式时,sizeof(szName)为4字节5)用于结构体
在默认情况下,为了方便对结构体内的元素进行访问和管理,结构体类型需要符合4字节对齐。
struct tagEx1 { unsigned nAge; }; struct tagEx2 { unsigned nAge; char ch; }; struct tagEx3 { char ch; }; cout << "tagEx1: " << sizeof(tagEx1) << endl;//4个字节 cout << "tagEx2: " << sizeof(tagEx2) << endl;//8个字节,4字节对齐 cout << "tagEx3: " << sizeof(tagEx3) << endl;//1个字节
6)用于类
sizeof用于类的用法和用于结构体的是一致的。另外,对类类型我们还可以使用cl命令完成类类型内存大小的查看,具体用法见博文C++对象内存模型分析工具 。
标签:
原文地址:http://blog.csdn.net/c_base_jin/article/details/52081488