栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

详解C++ sizeof(上)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解C++ sizeof(上)

sizeof是C/C++中的一个操作符(operator),其作用是返回一个对象或者类型所占的内存字节数,使用频繁,有必须对其有个全面的了解。

1.sizeof的基本语法

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

2.sizeof计算基本类型与表示式

sizeof计算对象的大小实际上是转换成对象类型进行计算,也就是说,同种类型的不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,sizeof是编译时进行运算,与运行时无关,不会对表达式进行计算。考察如下代码:

#include 
using namespace std;
int main(int argc,char* argv[])
{
cout<<"sizeof(char)="<
char* pc = "abc";
int* pi=new int[10];
string* ps;
char** ppc = &pc;
void (*pf)(); // 函数指针
char testfunc()
{
return ‘k';
}
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf ); // 结果为4
sizeof( &testfunc ); // 结果为4
sizeof( testfunc ()); // 结果为1
sizeof(*( testfunc) ()); // 结果为1

考察以上代码,得出如下结论:

(1)指针变量的sizeof值与指针所指的对象类型没有任何关系,与指针申请多少空间没有关系,所有的指针变量所占内存大小均相等。那为什么在本机64bits系统下,指针变量大小仍然是4个字节,因为使用32位编译器编译得到程序是32位,故指针大小是4字节,可自行修改编译器版本,不再赘述。

(2)&testfunc代表一个函数指针,指针大小是4,所以sizeof(&testfunc)==4。testfunc()代表一次函数调用,返回值类型是char,所以sizeof(testfunc())==sizeof(char)==1。testfunc名本身就是一个函数指针,所以(*testfunc)()也是一次函数调用,sizeof((*testfunc)())==sizeof(char)==1。

4.sizeof计算数组

当sizeof作用于数组时,求取的是数组所有元素所占用的大小。参考如下代码:

int A[3][5];
char c[]="123456";
double*(*d)[3][6];

cout<

考察以上代码,得出如下结论:
(1)A的数据类型是int[3][5],A[4]的数据类型是int[5],A[0][0]数据类型是int。所以

sizeof(A)==sizeof(int[3][5])==3*5*sizeof(int)==60
sizeof(A[4])==sizeof(int[5])=5*sizeof(int)==20
sizeof(A[0][0])==sizeof(int)==4

尽管A[4]的下标越界,但不会造成运行时错误,因为sizeof运算只关心数据类型,在编译阶段就已经完成。

(2)由于字符串以空字符''结尾,所以c的数据类型是char[7],所以sizeof(c)=sizeof(char[7])==7。

(3)d是一个指针,不管它指向的对象是什么数据类型,自身大小永远是4,所以sizeof(d)==4。sizeof(*d)的数据类型是double*[3][6],所以

sizeof(*d)==sizeof(double*[3][6])==3*6*sizeof(double*)==18*4==72

同理,可以推算出

sizeof(**d)==sizeof(double*[6])==6*sizeof(double*)==24
sizeof(***d)==sizeof(double*)==4
sizeof(****d)=sizeof(double)==8

当数组作为函数形参时,下面的i和j的值应该是多少呢?

void foo1(char a1[3])
{
int i = sizeof( a1 ); // i == ?
}
void foo2(char a2[])
{
int j = sizeof( a2); // j == ?
}

也许当你试图回答j的值时已经意识到i答错了,是的,i!=3。这里函数参数a1已不再是数组类型,而是蜕变成指针,相当于char* a1,为什么?仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗?不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a1自然为指针类型(char*),i的值也就为4,同样j也是4。

以上就是详解C++ sizeof(上)的详细内容,更多关于C++ sizeof的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/61399.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号