c/c++面试12-18------关与sizeof那些事儿
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那些事儿的更多相关文章
- Sprint3(12.18)总结
Sprint3第三阶段 1.类名:软件工程-第三阶段 2.时间:至12.18 3.选题内容:web版-餐厅到店点餐系统 4.团队博客地址: http://www.cnblogs.com/queenju ...
- 剑指offer 面试12题
面试12题: 题目:矩阵中的路径 题:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格 ...
- php面试专题---18、MySQL查询优化考点
php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...
- 12.18 webSocket消息推送
---恢复内容开始--- 准备工作: 在要跳转到的页面加入js <#--弹窗--> <div class="modal fade" id="myModa ...
- AI行业精选日报_人工智能(12·18)
百度Apollo升级自动驾驶平台,发布车路协同.智能车联两大平台 12 月 18 日消息,Apollo 发布了全球首个点到点城市自动驾驶开放能力.自动驾驶云.新一代智能交通解决方案.小度车载 2020 ...
- NYOJ-20 吝啬的国度 AC 分类: NYOJ 2014-01-23 12:18 200人阅读 评论(0) 收藏
#include<cstdio> #include<cstring> #include<vector> using namespace std; int pre[1 ...
- [google面试CTCI] 1-8.判断子字符串
[字符串与数组] Q:Assume you have a method isSubstring which checks if one word is a substring of another G ...
- 面试 12:玩转 Java 快速排序
终于轮到我们排序算法中的王牌登场了. 快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用.再加上快速排序思想——分治法也确实非常实用,所以 在各大厂的面试习题中,快 ...
- 12.18 微信扫码获取openid与登陆
官方文档: https://open.weixin.qq.com/ 1.先获取code 1-1 配置项目配置文件 wechat: mpAppId: wxd898fcb01713c658 mpAppSe ...
随机推荐
- [LeetCode]Insert Interval 考虑多种情况
写太复杂了. 思想:确定带插入区间的每一个边界位于给定区间中的哪个位置,共同拥有5种情况 -1 |(0)_1_(2)| (3) 当中.0,1,2这三种情况是一样的. 确定每一个带插入区间的两个边界分 ...
- 实例讲解SVN分支和合并问题(转)
本节向大家简单描述一下SVN分支和合并方面的知识,在学习SVN的过程中SVN分支和合并时经常遇到的问题,在这里和大家分享一下,希望本文对大家有用. 关于主线同SVN分支合并的概念及如何使用的误区此问题 ...
- LINUX创建用户的命令
LINUX创建用户的命令useradd -g test -d /home/test1 -s /etc/bash -m test1注解:-g 所属组 -d 家目录 -s 所用的SHELL 删除用户命令u ...
- 快速上手npm
1.npm的安装和更新 2.npm的常用操作 3.npm的常用配置项 4.npm常用命令速查表
- 【CUDA】CUDA开发环境搭建
http://blog.csdn.net/tracer9/article/details/50484764 标签: CUDA并行计算NVIDIAlinux 2016-01-08 18:35 637人阅 ...
- 分享一个小工具:Excel表高速转换成JSON字符串
在游戏项目中一般都须要由策划制作大量的游戏内容,当中非常大一部分是使用Excel表来制作的.于是程序就须要把Excel文件转换成程序方便读取的格式. 之前项目使用的Excel表导入工具都是通过Offi ...
- C#用Infragistics 导入导出Excel
最近项目中有数据的导入导出Excel的需求,这里做简单整理. 公司用的是Infragistics的产品,付费,不需要本地安装Office. 有需要的朋友可以下载 Infragistics.2013.2 ...
- TCP 同步传输:客户端发送,服务器段接收
1.服务器端程序 可以在TcpClient上调用GetStream()方法来获的链接到远程计算机的网络流NetworkStream.当在客户端调用时,他获的链接服务器端的流:当在服务器端调用时,他获得 ...
- HTML5学习笔记简明版(9):变化的元素和属性
改变的元素(Element) 下面元素在HTML5里的使用方法稍作改动以便能在web里更好的使用或者起到更大作用: 没有href属性的a元素将显示成一个占位符,并且a元素内部如今支持flow cont ...
- TCP协议和socket API 学习笔记
本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilb ...