sizeof总结
1.sizeof常用总结
①与strlen比较
strlen 计算字符串的字符数,以"\0"为结束判断,但不统计结束符。
sizeof 计算数据(数组、变量、类型、结构体等)所占内存空间,用字节数表示。
②指针与静态数组的sizeof操作
指针均可看为变量类型的一种。因此:
例:int *p;
sizeof(p)=4;
sizeof(*p)=4;//相当于sizeof(int)
对于静态数组,sizeof可直接计算数组大小:
例:int a[10];char b[]="hello";
sizeof(a)=40;//4*10=40;
sizeof(b)=6;
数组做型参时,数组名称当作指针使用:
例: void fun(char p[]);
sizeof(p)=4;
③格式的写法
sizeof为操作符而非函数,对变量或对象可以不加括号,但若是类型,须加括号。
④操作string的注意事项
string str[]={"hello", "world", "CHB","\n"};
cout<<sizeof(str)<<endl;//输出128
cout<<sizeof(str[0])<<endl;//输出32,即对象的大小
cout<<sizeof(str[0].c_str())<<endl;//输出4,c_str()返回 const char*指针,指向str[0]
cout<<strlen(str[0].c_str())<<endl;//输出5,str[0]字符串的长度
⑤经典问题:
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4,a为指针
cout<<sizeof(*a)<<endl; // 72 ,*a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24, **a为行指针
cout<<sizeof(***a)<<endl; // 4 ,***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ,****a为一个double变量
解析:a为指向double*[3][6]类型二维指针数组(数组元素为double*
指针类型)的指针。既然是指针,所以sizeof(a)就是4。*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。
double**b[3][6];
cout<<sizeof(b)<<endl; // 72,b为数组类型,数组元素为double**;
cout<<sizeof(*b)<<endl; // 24,行指针
cout<<sizeof(**b)<<endl; // 4,b[0][0]的值,double**类型
cout<<sizeof(***b)<<endl; // 4,double*
cout<<sizeof(****b)<<endl; // 8 double
double (*c)[3][6];
cout<<sizeof(c)<<endl;//4,指针变量,指向double[3][6]
cout<<sizeof(*c)<<endl;//144,double[3][6]的数组类型
cout<<sizeof(**c)<<endl;//48,行指针,指向c[0],实际指向为&c[0][0]
cout<<sizeof(***c)<<endl;//8,c[0][0]的值
double* d[3][6];
cout<<sizeof(d)<<endl; // 72,指针数组类型,元素为double*的[3][6]数组
cout<<sizeof(*d)<<endl; // 24,行指针
cout<<sizeof(**d)<<endl; // 4,d[0][0]的元素值,即double*
cout<<sizeof(***d)<<endl; // 8
⑥操作struct的内存对齐问题
(1)整体空间是占用空间最大的成员(的类型)所占字节数的整倍数
(2)内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。
(3)数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。
例子1
- struct s1{
- char a;
- double b;
- int c;
- char d;};
- struct s2{
- char a;
- char b;
- int c;
- double d;};
- cout<<sizeof(s1)<<endl; // 24
- cout<<sizeof(s2)<<endl; // 16
占空间的最大成员是double类型变量,故对齐空间大小为8。s1中的c和d,s2中a,b,c可以放进一个“8”位空间中。
例子2
- struct s1
- {char a[8];};
- struct s2
- {double d;};
- struct s3{
- s1 s;
- char a;};
- struct s4{
- s2 s;
- char a; };
- cout<<sizeof(s1)<<endl; // 8
- cout<<sizeof(s2)<<endl; // 8
- cout<<sizeof(s3)<<endl; // 9
- cout<<sizeof(s4)<<endl; // 16
虽然s1和s2大小都是8,但是s1的对齐空间大小是1(char),s2是8(double)。所以定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。这里结构体中定义的数组可以当做多个同类数据顺序排列,以此确定对齐的空间大小。
例子3
- struct s1 {
- int i: 8;
- int j: 4;
- double b;
- int a:3;};
- struct s2 {
- int i;
- int j;
- double b;
- int a;};
- struct s3 {
- int i;
- int j;
- int a;
- double b;};
- struct s4 {
- int i: 8;
- int j: 4;
- int a:3;
- double b;};
- cout<<sizeof(s1)<<endl; // 24
- cout<<sizeof(s2)<<endl; // 24
- cout<<sizeof(s3)<<endl; // 24
- cout<<sizeof(s4)<<endl; // 16
在结构体和类中,可以使用位域来规定某个成员所能占用的空间,所以使用位域能在一定程度上节省结构体占用的空间。double存在会干涉到位域。所以使用位域的的时候,最好把float类型和double类型放在程序的开始或者最后。
注意:计算结构体嵌套结构体的内存空间时,注意嵌套之结构体的对齐空间非所占空间,而是两者的最大size变量。数组并不作为一个整体变量计算内存。
⑦基本操作结果
sizeof int:4
sizeof short:2
sizeof long:8
sizeof float:4
sizeof double:8
sizeof char:1
sizeof *p:4
sizeof WORD:2
sizeof DWORD:4
64位系统中:
指针一律为8字节
2.其它
如下:
class A{
int i;
union U{
char buffer[13];
int i;
} u;
typedef int* (*p)(int,int);
enum{red,blue,white} e;
};
sizeof(A)为 4+16+0+4=24。注意,union设计到内存对齐,并且以最大的存储单元计算空间,此时应为16。enum类型变量大小为4。这里应该注意的是,typedef只是定义了一个类型,并没有定义变量,因此不占内存空间。反之,倘若A存在成员指针,不管是什么类型的,大小都为4.
倘若用#pragma
pack(2)约束以两个字节对齐,则结果为22.因为此时枚举类型大小为14.
sizeof总结的更多相关文章
- 聊聊 C 语言中的 sizeof 运算
聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...
- c/c++中关于sizeof、strlen的使用说明
sizeof: 一般指类型.变量等占用的内存大小(由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小) strlen: c字符串的长度(参数必须是字符型指针 char*,当数组名作 ...
- sizeof(转载)
原文地址:http://blog.sina.com.cn/s/blog_5da08c340100bmwu.html 转载至:http://www.cnblogs.com/wangkangluo1/ar ...
- C语言中的sizeof()
sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但当我总结的时候才发现,这个 ...
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...
- c语言 sizeof理解
1.基本数据类型 char :1 short:2 int 4 long 4 long long :8 float:4 double :8字节. 2.数组:对应的基本数 ...
- sizeof与strlen的区别
1 sizeof是操作符,而strlen是库函数: 2 sizeof的参数可以为任意变量或类型,而strlen必须以char*做参数,且字符串必须以‘/0’结尾: 3 数组名用作sizeof参数时不会 ...
- sizeof
一.sizeof使用的场合: 1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信.例如: void* malloc(size_t size); size_t fread(v ...
- strlen()和sizeof()求数组长度
在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...
随机推荐
- spring boot: 计划任务@ EnableScheduling和@Scheduled
spring boot: 计划任务@ EnableScheduling和@Scheduled @Scheduled中的参数说明 @Scheduled(fixedRate=2000):上一次开始执行时间 ...
- java:输出流程printStream
// TODO 自动生成的方法存根 //路径文件 File file = new File("F:"+File.separator+"work"+File.se ...
- 高性能Js—数据存取
数据存取 JavaScript中四中基本的数据存取位置 字面量:不存于某个变量内 本地变量:var定义的 数组元素 对象成员 字面量.全局变量读取速度 > 数组项.对象成员 .因为局部变量存在于 ...
- substr 方法
substr 方法 返回一个从指定位置开始,并具有指定长度的子字符串. 参数 start 必选.所需的子字符串的起始位置.字符串中第一个字符的索引为 0. length 可选项.返回的子字符串中包含的 ...
- EDID真实数据块,请参考标准文档仔细核对
数据格式的详细说明:http://en.wikipedia.org/wiki/Extended_display_identification_data 下面是一个例子:
- Java匿名对象和匿名类总结
一.匿名对象 匿名对象是没有名字的实体,也就是该实体没有对应的变量名引用 匿名对象的特征: 创建的匿名类的对象只能够调用一次 匿名对象只在堆内存中开辟空间 ...
- 一段tcl代码
#!/usr/bin/wish proc icanspeak {} { set name [.ent get] } { exec s $name } } label .lab -text " ...
- 转:STL迭代器失效问题
. 对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可.这是因为 ...
- BZOJ - 3631 松鼠的新家 (树链剖分)
题目链接 树链剖分基础题,路径权值修改+差分 #include<bits/stdc++.h> using namespace std; typedef long long ll; ; in ...
- 每天一个linux命令(15):head命令
版权声明更新:2017-05-19博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...
