一、sizeof使用的场合:

1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

 void* malloc(size_t size);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE* stream)

2、用它可以看看某种类型的对象在内存中所占的单元字节。例如:

  void *memset(void *s, int c, sizeof(s));

3、在动态分配一对象时,可以让系统知道要分配多少内存。

4、便于一些类型的扩充。在windows中很多结构类型就有一个专用的字段用来存放该类型的字节大小。

5、由于操作数的字节数在实现时可能出现变化,建议在涉及操作数字节大小时用sizeof代替常量计算。

6、如果操作数就是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

二、sizeof不能使用的场合:

sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型等。

三、

 cout<<sizeof(string*)<<endl; //
cout<<sizeof(int*)<<endl; //
cout<<sizof(char****)<<endl; // int f();
cout << sizeof(f) << endl; //编译错误
cout << sizeof(f()) << endl; // int a=;
cout << sizeof(a=) << endl; //输出4,
11 cout << a << endl; //输出6。sizeof只是个运算符,所以相当于符号替换,a=8被替换成int,并不会修改a的值。

四、

 #include <iostream>
using namespace std; int Sum(int i[]) {
int sumofi = ;
for (int j = ; j < sizeof(i)/sizeof(int); j++) //实际上,sizeof(i) = 4这里数组名在形参作为指针
sumofi += i[j];
return sumofi;
} int main() {
int allAges[] = {, , , , , };
cout<<Sum(allAges)<<endl;
return ;
}
Sum的本意是用sizeof得到数组的大小,然后求和。但是实际上,传入自函数Sum的,只是一个int 类型的指针,所以sizeof(i)=4,而不是24,所以会产生错误的结果。解决这个问题的方法使是用指针或者引用。
一般求数组的长度我们会习惯用函数模板。这个可以参考文章《函数模板》。
 
五、
 double* (*a)[][];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。 既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof  (double*)=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。 
 #include <iostream>

 using namespace std;

 int main() {
char (*f)[];
int **c[][];
double *(*a)[][];
cout << sizeof(f) << endl; //
cout << sizeof(*f) << endl; //
cout << sizeof(**f) << endl; //
cout << sizeof(a) << endl; //
cout << sizeof(*a) << endl; //
cout << sizeof(**a) << endl; //
cout << sizeof(***a) << endl; //
cout << sizeof(****a) << endl; //
cout << sizeof(c) << endl; //
return ;
}
六、sizeof(class)
空类的大小为1,其他跟struct差不多,可以参见《字节对齐详解》里面的内容。需要指出的是class里面的virtual函数是独立开来的,virtual代表的是一个虚函数指针,它是一个虚函数表的地址入口。例如:
 class classB {
char a;
// double b;
// int c;
virtual func1(){}
};
因为虚函数指针占了四个字节,char占了一个字节,安照对齐原则,sizeof(classB)=8, 如果去掉注释int c,那就变成了12. 但,注意如果现在注释int c,而去掉double b的注释,guess what's it? 按一般来说,应该是16,一个double加char和一个指针,补足16位,但实际上是24,因为指针是单独拿出来算了,这就变成了double,加上char补足的八位,加上指针补足的八位,一共是24个字节了。
 

sizeof的更多相关文章

  1. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  2. c/c++中关于sizeof、strlen的使用说明

    sizeof: 一般指类型.变量等占用的内存大小(由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小) strlen: c字符串的长度(参数必须是字符型指针 char*,当数组名作 ...

  3. sizeof(转载)

    原文地址:http://blog.sina.com.cn/s/blog_5da08c340100bmwu.html 转载至:http://www.cnblogs.com/wangkangluo1/ar ...

  4. C语言中的sizeof()

    sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但当我总结的时候才发现,这个 ...

  5. 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

    一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...

  6. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

    一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...

  7. c语言 sizeof理解

    1.基本数据类型 char :1     short:2   int 4    long 4   long long :8    float:4    double :8字节. 2.数组:对应的基本数 ...

  8. sizeof与strlen的区别

    1 sizeof是操作符,而strlen是库函数: 2 sizeof的参数可以为任意变量或类型,而strlen必须以char*做参数,且字符串必须以‘/0’结尾: 3 数组名用作sizeof参数时不会 ...

  9. strlen()和sizeof()求数组长度

    在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...

随机推荐

  1. 1.Java网络编程之概述

    黑马程序员_毕向东_Java基础视频教程第23天-01-网络编程(概述)学习笔记 网络通讯三要素: 1.IP地址 I.网络中设备的标识  II.不易记忆,可用主机名 www 万维网组织,baidu主机 ...

  2. Javascript进阶之路-论对象的重要性

    要了解JavaScript对象,我们可以从对象创建.属性操作.对象方法这几个方面入手.概括起来,包括以下几模块: 1.创建对象        1.1 对象直接量        1.2 通过new创建对 ...

  3. gRPC C#学习

    前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...

  4. 针对Asp.net MVC SEO的几点建议

    1. 引言 SEO 即搜索引擎优化,很多web开发人员本应该熟悉,至少需要了解的一个知识点.像百度.必应等搜索引擎其实一直都在进化.但是有些优化的技巧可能在短时间内不变. 今天就给大家介绍几个专门针对 ...

  5. Setting my home here

    New here (For no chinese input on this machine, I have to use English.) Why do I choose here ? Whene ...

  6. virtualbox 虚拟机Ubuntu 传文件-共享

  7. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  8. PHP常量

    常量的定义 在PHP中,常量的声明是通过define()函数来定义的,它也是对大小写敏感的,按照一般的习惯PHP常量总是大写的,且不能再命名的常量之前加上$符号,在这里详细介绍一下define()函数 ...

  9. 001.Getting Started -- 【入门指南】

    Getting Started 入门指南 662 of 756 people found this helpful Meng.Net 自译 1. Install .NET Core 到官网安装 .NE ...

  10. javascript封装与多态的体现

    封装是实现面向对象程序设计的第一步,封装就是将数据与函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型. 在传统的面向对象语言中有访问修饰符,如Private:只有类本身能 ...