描述
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应用技巧
格式:sizeof(type) 数据类型必须要用括号括住,如下示例:
int n = sizeof(int);
2)用于普通数据类型的变量
格式: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字节,数组名代表整个数组
因此用于初始化数组空间时建议使用sizeof(type) * num.这么做是基于代码更加健壮性的考虑,例如:
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++对象内存模型分析工具 。