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 ...
随机推荐
- HDU 3308 LCIS (线段树·单点更新·区间合并)
题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并 线段树维护三个值 相应区间的LCIS长度(lcis) 相应区间以左 ...
- UltimateRecyclerView的用法具体解释
近期在用非常多第三方库的时候,发现有一些附带的demo写的不是非常全面或者样例的代码太多,凝视太少,要想使用还要去看下源代码什么的(.. .用第三方开源库不就是想节省时间嘛).所以决定每周两到三篇.写 ...
- 《TCP/IP具体解释卷2:实现》笔记--UDP:用户数据报协议
用户数据报协议.即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作仅仅产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口 ...
- lua 定义类 就是这么简单
在网上看到这样一段代码,真是误人子弟呀,具体就是: lua类的定义 代码如下: local clsNames = {} local __setmetatable = setmetatable loca ...
- 基于struts2的学生报道管理系统(附github源码地址)
本项目参考了<java web轻量级开发全体验>,加入了对mysql的支持. 一.基本业务功能 通过struts2框架,结合mysql数据库构建一个学生报到管理系统,来模拟学生报到登记的过 ...
- 九度OJ 1086:最小花费 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3960 解决:819 题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下 ...
- Problem binding to [bigdata-server-01:9000] java.net.BindException: Cannot assign requested address;
If the port is "0", then the OS is looking for any free port -so the port-in-use and port- ...
- git 的安装
git在开发中已经成了必备工具了,我们来看看git在各个平台上的安装 1.Linux上安装git $sudo apt-get install git 2.mac上安装 1)homebrew安装git ...
- 关于ActiveMQ接收端停止接收的方法
现在有一个需求: 在发送端服务器出现故障后,接收端的接收方法要停下来,关于停止接收的方法,我做了下面这些事情: // 获取 ConnectionFactory ConnectionFactory co ...
- UOJ Easy Round#7
UOJ Easy Round#7 传送门:http://uoj.ac/contest/35 题解:http://matthew99.blog.uoj.ac/blog/2085 #1 题意: 在一个(2 ...