12 使用sizeof计算普通变量所占空间大小

(1)不同数据类型所占字节数不同(32位 64位系统不同)

int----->4

double----->8

char------->1

(2)代码

 #include<stdio.h>
#include <stdlib.h>
void Func(char str[])
{
printf("sizeof(str)=%d\n", sizeof(str));
}
int main()
{
char str[] = "hello";
char *p = str;
int n = ;
printf("sizeof(str)=%d\n", sizeof(str));//
printf("sizeof(p)=%d\n", sizeof(p));//
printf("sizeof(n)=%d\n", sizeof(n)); //
void *pp = malloc();
printf("sizeof(pp)=%d\n", sizeof(pp));//
Func(str);
getchar();
}

注意:

  (1)数组作为实际参数传给函数的时候,当作指针来看待,不是绝对的。

  (2)sizeof不是函数  是一个运算符

13 使用sizeof计算类对象所占空间大小

(1)代码

 #include<stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
int i;
};
class B
{
public:
char ch;
};
class C
{
public:
int i;
short j;
}; class D
{
public:
int i;
short j;
char ch;
};
class E
{
public:
int i;
int ii;
short j;
char ch;
char chr;
}; class F
{
public:
int i;
int ii;
int iii;
short j;
char ch;
char chr;
}; int main()
{
cout << "sizeof(int)=" << sizeof(int) << endl;
cout << "sizeof(short)=" << sizeof(short) << endl; cout << "sizeof(char)=" << sizeof(char) << endl; cout << "sizeof(A)=" << sizeof(A) << endl; cout << "sizeof(B)=" << sizeof(B) << endl; cout << "sizeof(C)=" << sizeof(C) << endl; cout << "sizeof(D)=" << sizeof(D) << endl; cout << "sizeof(E)=" << sizeof(E) << endl;
cout << "sizeof(F)=" << sizeof(F) << endl; getchar();
return ;
}

(2)吃惊的代码结果

(3)分析分析

  a:32位win操作系统 char-->1个字节 int---->4个字节 short----->2字节

  sizeof(A)=sizeof(int)=4

  sizeof(B)=sizeof(char)=1

  sizeof(C)=sizeof(int)+sizeof(short)=4+2=6

  sizeof(D)=sizeof(int)+sizeof(short)+sizeof(char)=7

  sizeof(E)=2*sizeof(int)+2*sizeof(char)+sizeof(short)=12

  sizeof(F)=3+sizeof(int)+2*sizeof(char)+sizeof(short)=15

------------>这和运行的结果有出入呀

  (b)这就是字节对齐造成的,结论如下;

------------>结构体每个成员相当于结构体的首地址偏移量都是成员大小的整数倍

------------>结构体总大小为结构体最宽基本类型成员大小的整数倍

举个例子:

struct A

{

  char c1;

  int i;

  char c2;

};--------------------->c1的偏移量是0,i的偏移量是4,那么c1和i之间就有3个字节的填充,再加上i的四个字节,所以c2的偏移量就是8,那么总共1+3+4+1=9;但是这个结构体最宽的基本类型是int,为4字节,要是它整数,那么就需要填充3字节 9+3=12,所以为12字节。也不知道清楚了没!!

15 使用sizeof计算含有虚函数类对象的空间大小

(1)代码

 #include <iostream>

 using namespace std;

 class Base
{
public:
Base(int x) :a(x)
{ }
void print()
{
cout << "base" << endl;
}
private:
int a;
};
class Drived :public Base
{
public:
Drived(int x) :Base(x - ), b(x)
{ }
void print()
{
cout << "derived" << endl;
}
private:
int b;
};
class A
{
public:
A(int x) :a(x)
{ }
virtual void print()
{
cout << "A" << endl;
}
private:
int a;
};
class B :public A
{
public:
B(int x):A(x - ),b(x)
{ }
virtual void print()
{
cout << "b" << endl;
}
public:
int b;
}; int main()
{
Base obj1();
cout << "size of base obj is" << sizeof(obj1) << endl;
Drived obj2();
cout << "size of base obj is" << sizeof(obj2) << endl; A a();
cout << "size of A obj is" << sizeof(a) << endl;
B b();
cout << "size of B obj is" << sizeof(B) << endl;
getchar();
return ;
}

(2)解析

  a;A是空类,编译器会安插一个char给空雷用来标记它的每一个对象

  b:类D是虚继承A,编译器会为该类一个指向父类的指针,4字节

  c:类E虚继承AB  8

16 sizeof和strlen哪些区别

  (1)sizeof是操作符 strlen是函数

  (2)sizeof可以用类型做参数,strlen参数必须是char*,而且必须以'\0'结尾

  (3)在计算 字符串数组长度有区别

    a:char str[20]="0123456789"

      int a = strlen(str);//以ox00结束的字符串长度 10

      int b = sizeof(str)//分配str[20]所占内存空间的大小 20

17 sizeof有哪些用途

  (1) 与分配和IO系统那样的例程进行通信

    void* malloc(size_t size)

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

(2)动态分配对象 让系统知道分配多大的内存

  (3)如果操作数是函数中的数组形参或者函数类型的形参,那么sizeof给出的是指针大小

18 使用sizeof计算联合体的大小

(1)注意

  a:联合体的大小取决于它所有成员中占用空间大小最大的成员的大小

(2)代码

 #include <iostream>
using namespace std;
union u
{
double a;
int b;
};
union u2
{
char a[];
int b;
};
union u3
{
char a[];
char b;
};
int main()
{
cout << sizeof(u) << endl;//
cout << sizeof(u2) << endl;//
cout << sizeof(u3) << endl;//
getchar();
}

(3)分析

  a:对于u,大小最大为double 所以sizeof(u)=sizeof(double)=8

  b:对于u2,最大是char buf[13],但是还有int,4字节,所以对齐方式变为4,所以占用空间变为最接近13的16

  c:对于u3,最大的空间是char[13]数组,所以13

---------->其实对齐的方案是可以更改的,对于c++固有对齐取编译器对齐方式与自身大小较小的一个,看下面的例子

  d(代码2):

  

 #include <iostream>
#pragma pack(2) union u
{
char buf[];
int a;
};
int main()
{
cout<<sizeof(u)<<endl;//10 因为对齐从4变化为2 9最近且满足2倍数10
return ;
}

好了  加油加油!!!

c/c++面试12-18------关与sizeof那些事儿的更多相关文章

  1. Sprint3(12.18)总结

    Sprint3第三阶段 1.类名:软件工程-第三阶段 2.时间:至12.18 3.选题内容:web版-餐厅到店点餐系统 4.团队博客地址: http://www.cnblogs.com/queenju ...

  2. 剑指offer 面试12题

    面试12题: 题目:矩阵中的路径 题:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格 ...

  3. php面试专题---18、MySQL查询优化考点

    php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...

  4. 12.18 webSocket消息推送

    ---恢复内容开始--- 准备工作: 在要跳转到的页面加入js <#--弹窗--> <div class="modal fade" id="myModa ...

  5. AI行业精选日报_人工智能(12·18)

    百度Apollo升级自动驾驶平台,发布车路协同.智能车联两大平台 12 月 18 日消息,Apollo 发布了全球首个点到点城市自动驾驶开放能力.自动驾驶云.新一代智能交通解决方案.小度车载 2020 ...

  6. NYOJ-20 吝啬的国度 AC 分类: NYOJ 2014-01-23 12:18 200人阅读 评论(0) 收藏

    #include<cstdio> #include<cstring> #include<vector> using namespace std; int pre[1 ...

  7. [google面试CTCI] 1-8.判断子字符串

    [字符串与数组] Q:Assume you have a method isSubstring which checks if one word is a substring of another G ...

  8. 面试 12:玩转 Java 快速排序

    终于轮到我们排序算法中的王牌登场了. 快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用.再加上快速排序思想——分治法也确实非常实用,所以 在各大厂的面试习题中,快 ...

  9. 12.18 微信扫码获取openid与登陆

    官方文档: https://open.weixin.qq.com/ 1.先获取code 1-1 配置项目配置文件 wechat: mpAppId: wxd898fcb01713c658 mpAppSe ...

随机推荐

  1. Install Server Backup Manager on CentOS, RHE, and Fedora

    Skip to end of metadata Added by Internal, last edited by Internal on Aug 25, 2014 Go to start of me ...

  2. NTAG 标签

    NTAG 标签 这里描述针对 NTAG213.而 NTAG215/216只是容量不同,其它功能都一样.  UID UID 有 7 bytes.上图中有 9 bytes 的 serial number ...

  3. erlang实现DNS解析域名

    erlang的DNS解析,有个inet模块,可以做这个事情,对应的api如下:(这里用的R16B的版本) inet:getaddr/2解析对应一个ip,而inet:getaddr/2解析有可能对应1个 ...

  4. ffmpeg mediacodec 硬解初探

    ffmpeg mediacodec 硬解初探 1编译: ffmpeg自3.1版本加入了android mediacodec硬解支持,解码器如图 硬件加速器如图(还不清楚硬件加速器的功能) 编译带h26 ...

  5. fabric-ca安装

    1.Go版本1.7+(具体可参考Linux安装Go语言) 2.GOPATH环境变量正确配置 export GOROOT=/usr/local/go export GOPATH=/opt/gopath ...

  6. NGUI研究之3D模型坐标转2D屏幕坐标-血条

     刚好今天有朋友问我,比較典型的样例就是游戏里面人物的血条. 原理非常easy就是把3D点换算成2D的点.可是因为NGUI自身是3D所以我们须要先把NGUI下的点转成2D点.然后在把他转成3D的点 ...

  7. 初学php html javascript后小总结

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/c3568/article/details/30474015 转载请注明出处:http://blog. ...

  8. [通信]Linux User层和Kernel层常用的通信方式

    转自:https://bbs.csdn.net/topics/390991551?page=1 netlink:https://blog.csdn.net/stone8761/article/deta ...

  9. int 转十六进制

    //使用1字节就可以表示bpublic static String numToHex8(int b) {        return String.format("%02x", b ...

  10. JavaWeb浏览器传值乱码

    在Java服务接口调用中,可能会出现乱码,如下图所示: 这是由编码不一致而致的乱码,可转,如下: name = new String(name.getBytes("ISO-8859-1&qu ...