sizeof

1.sizeof是一个运算符,不是函数
2.sizeof不能求得void类型的长度,即sizeof(void)编译器会报错。void是一个空类型,编译器无法确定void类型变量的储存大小。
3.sizeof能够求得void类型变量指针的长度
指针是存放其他变量地址的变量,目前32为计算机的程序段寻址范围是4GB,寻址的最小单元是byte,4GB=2^32Byte,这么多的内存它的地址要是编码,需要32bit,32bit=32/8=4byte,需要4byte就能够储存这些内存的地址,因此对于任何类型的指针变量进行sizeof运算结果是4.
4.sizeof能够求得静态分配内存


sizeof.png

对于数组a[10],sizeof(a)=10*sizeof(int)=40,
对于字符串数组char ch[]="abc",sizeof(ch)=4,因为字符串数组结尾有' ',代表字符串结束。
可以利用sizeof(a)/sizeof(a[0])来计算数组包含的元素个数。

void fun(int array[10])
{
     int n=sizeof(array);
}

此时数组array在函数中被当做指针对待,所以int =sizeof(array)等于4.

sizeof1.png

5.sizeof不能求得动态分配的内存的大小

int *a=new int[10];
int n=sizeof(a);

此时a的值不能确定。
6.sizeof不能对不完整的数组求长度。
假设有sizoef4.cpp文件和sizeof44.cpp文件,在sizeof44.cpp文件中定义

int arrayA[10]={1,2,3,4,5,6,7,8,9,10};
int arrayB[10]={11,12,13,14,15,16,17,18,19,20}

创建sizeof44.h文件,将arrayA和arrayB声明为全局变量

extern int arrayA[];
extern int arrayB[10];

sizeof4.cpp中这样写

#include <iostream>
#include "sizeof44.h"
using namespace std;
int main()
{
      arrayA[];
      arrayB[10];

      cout<<sizeof(arrayA)<<endl;//程序会报错
      cout<<sizeof(arrayB)<<endl;
}

sizeof4.png

sizeof4.cpp:10:21: error: invalid application of 'sizeof' to incomplete type 'int []' 的意思是sizeof不知道占了多少内存。
运行上述程序,cout<<sizeof(arrayA)<<endl会报错,屏蔽掉这句程序的到结果40,是arrayB的大小。

sizeof5.png

7.sizeof求表达式的大小时,返回值是计算结果的大小

char ch=1;
int num=1;
int n1=sizeof(ch+num);
int n2=sizeof(ch=ch+num);

结果n1=4,n2=1,ch+num计算的结果类型是int, ch=ch+num的结果类型是char,ch+num在计算时结果是int,但是把结果赋给ch时进行的类型转换,表达式的最终类型是char

sizeof6.png

8.sizeof可以对函数求大小,求得的大小等于函数返回类型的大小

int fun(int& num,const int& inc)
{
     float div=2.0;
     double ret=0;
     num=num+inc;
     ret=num/div;
     return ret;
}

语句:

int a=3;
int b=5;
cout<<sizeof(fun(a,b))<<endl;
cout<<a<<endl;

sizeof(fun(a,b))的值是4,sizeof在求函数大小是,得到的是函数返回值类型的大小,fun(a,b)的返回值类型是int,sizeof(int)=4。

9.sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和.

struct A{
           int num1;
           int num2;
           double num3;
};

struct B{
           int num1;
           double num3;
            int num2;
};

结构体对齐规则:
(1)结构体的大小等于结构体内最大成员大小的整数倍。
(2)结构体内成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍。比如double型成员相对于结构体首地址的地址偏移量应该是8的倍数。
(3)为了满足(1)(2)的规则编译器会在结构体成员之后进行字节填充。
sizeof(A)中num1大小是4占0-3位,num2大小为4占4-7位满足(2)规则,num3大小为8占8-15,满足(1)(2),所以sizeof(A)=16.
sizeof(B)num1大小4占0-3位,num2大小为8,此时num2对于结构体首地址的偏移量是,不满足规则(2),为了满足(2)对num1填充4个字节,占4-7位,num2从8位开始占8-15位,num3大小为4占15-19位不满足规则(1)所以给num3填充19-23,所以结构B的大小最终为24。
10.:sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容