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 ...
随机推荐
- Can't open named pipe to host: . pipe: MySQL
今天遇到mysql连接odbc时报例如以下错误:Can't open named pipe to host: . pipe: MySQL 错误截图例如以下: 依照网上说的方法包含mysql的官方说法都 ...
- PCB板布线中地线和电源线的布线规则
电源. 地线的布置考虑不周到而引起干扰,使产品的性能下降,严重时会降低产品的成功率.要把电源线和地线处理好,将电源线和地线所产生的噪音干扰降到最低限度,以保证产品的质量.一.电源线和地线的布线规则1) ...
- TFS 解除独占锁定
cmd 进入Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE tf workspace /delete 工作区名;创建的用户 / ...
- Java Base64加密、解密原理Java代码(转载)
博客来源:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方 ...
- 果壳、推库、虎秀、知乎、it世界
果壳.推库.虎秀.知乎.it世界
- Drawing Images and Text
using System;using UIKit;using Foundation;using CoreGraphics;namespace GraphicsAnimation{ public cla ...
- 【iOS开发】---- UIView动画
iOS 动画UIView动画 原文:http://www.cocoachina.com/bbs/read.php?tid=110168 1.概述 UIKit直接将动画集成到UIView类中,实现简 ...
- Qt中的打印操作
Qt中对打印的支持是有一个独立的printsupport模块来完成的,所以,要想在程序中使用Qt的打印功能,必须先在pro文件中添加下面这句代码: QT += printsupport在这个模块中,提 ...
- 配置tomcat,实现域名访问项目
首先,配置tomcat端口号为80,配置方法:配置tomcat,访问端口改为80 然后,配置访问项目时候,不用项目名,配置方法:配置tomcat,使访问项目时候无项目名 最后,配置tomcat的ser ...
- Objective-C 学习笔记
1. Hello, World #import <Foundation/Foundation.h> int main() { /* my first program in Objec ...