当前位置: 首页 > 科技观察

基于C-C++的sizeof使用

时间:2023-03-21 16:55:15 科技观察

在C/C++中,sizeof()是判断数据类型或表达式长度的运算符。1、sizeof定义sizeof是C/C++中的一个运算符,返回一个对象或类型占用的内存字节数。sizeof关键字给出了与变量或类型(包括聚合类型)关联的存储量(以字节为单位)。该关键字返回一个size_t类型的值。——来自MSDN,其返回值类型为size_t,在头文件stddef中。h定义为:typedefunsignedintsize_t;从sizeof的定义可以看出sizeof不是函数,因为函数调用必须有一对括号。#includeintmain(void){intnum=97;printf("sizeof(num=0)的值:%d\n",sizeof(num=0));printf("num的值:%d\n",num);return0;}运行结果为4,97;not4,0说明:sizeof不是标准意义上的一元运算符,不支持链式表达式,sizeof范围内的语句不会被编译成机器码,比如sizeof(num++)中的++不会被执行。sizeof也不是函数,sizeof更像是一个在编译时求值的特殊宏。2、sizeof的用法sizeof有两种语法形式,如下:sizeof(type_name);//sizeof(type);sizeof(object);//或sizeofobject属于sizeof对象;so:inti;sizeof(i);//Reasonablesizeofi;//reasonablesizeof(int);//reasonablesizeofint;//unreasonablesizeoftype_name在类型上使用sizeof时是非法的,必须写成sizeof(type_name);无论是对象还是类型值,sizeof()这种形式都是正确的;1)基本数据类型的sizeof这里的基本数据类型是指简单的内置数据类型,如short、int、long、float、double。由于它们的内存大小是系统相关的,所以在不同的系统中值可能不同。#includeusingnamespacestd;intmain(){cout<<"Sizeofchar:"<struct{intx;chary;}Test;intmain(){printf("%d\n",sizeof(Test));//输出8不是5return0;}结构体的大小为同结构体成员对齐是密切相关的,不是简单地等于每个成员大小的总和!例如,对以下结构体A、B两个结构体使用sizeof的结果分别为:16、24。可见sizeof(B)不等于sizeof(int)+sizeof(double)+sizeof(int)=16。structA{intnum1;intnum2;doublenum3;};structB{intnum1;doublenum3;intnum2;};结构A和B中包含的成员相同,只是顺序不同。为什么它们的大小不同?要解释这个问题,有必要了解结构体成员对齐的规则。结构的大小等于结构中最大成员大小的整数倍。成员在结构体中的首地址相对于结构体首地址的偏移量是类型大小的整数倍,例如double类型成员是相对于结构体首地址的。地址偏移量应该是8的倍数。为了满足规则1和2,编译器会在结构成员后面填充字节!从三个规则来看,为什么sizeof(B)等于24:首先假设结构体首地址为0,第一个成员num1的首地址为0(满足规则2),其类型为int,所以它占用地址空间0--3。第二个成员num3是double类型,占用8个字节。由于前面的num1只占了4个字节,为了满足规则2,需要用规则3在num1后面补4个字节(4——7),使得num3的起始地址偏移量为8,所以地址num3占用的空间为:8——15。第三个成员num2是int类型,大小为4。由于num1和num3共占用16个字节,因此无需任何填充即可满足规则2。所以num2占用的地址空间是16-19。那么结构体的总大小是0-19,一共20个字节吗?请注意,不要忘记规则1!由于结构体中最大的成员是double,占8个字节,所以需要在末尾的num2之后补4个字节,使结构体整体大小为24。structS{};sizeof(S);//结果是1。对一个空的struct结构进行sizeof运算,运算结果是1而不是0。因为编译器专门分配了一个字节来保证这个空struct的存在。如果有结构嵌套,内外层都需要采用内存对齐。6)类的sizeof1。没有继承和静态成员变量的类。在这种情况下,只需要考虑对齐。classA{public:intb;floatc;chard;};classB{};intmain(void){cout<<"sizeof(A)is"<