关于sizeof的笔试面试题具体解释
原创Blog,转载请注明处处
http://blog.csdn.net/hello_hwc
注意:sizeof是编译期计算出结果的,这一点对后面的理解非常重要
一、关于结构体
先看下代码
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef struct
{
char a:3;
char b:3;
char c:3;
char d:3;
char e:3;
}test1;
typedef struct
{
char a:3;
char b:4;
char c:5;
char d:6;
char e:7;
}test2;
typedef struct
{
char a:1;
char b:2;
char c:3;
char d:4;
char e:5;
}test3;
typedef struct{
int a;
char b;
char d;
long c;
}test4;
typedef struct{
int a;
char b;
long c;
char d;
}test5; int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(test1)<<endl;
cout<<sizeof(test2)<<endl;
cout<<sizeof(test3)<<endl;
cout<<sizeof(test4)<<endl;
cout<<sizeof(test5)<<endl;
return 0;
}
然后贴上执行结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="500" height="250" alt="">
解释下为什么
1、对于test1,结果是3Byte。有些同学好奇,3bit*5 = 15bit。不是应该占用2Byte吗?但是计算机没你大脑智能。它管理bit的方式是8bit一组。所以对于一组8bit,仅仅能放下两个3bit,另外2bit没用。所以,对于test1来说。三个Byte是这么分配的。
1Byte(3bit,3bit,2bit填充)2Byte(3bit,3bit,2bit填充)3Byte(3bit,5bit填充)
2、对于test2结果是4Byte.有了test1的解释,这里不难理解了吧。我再解释下内存分配。
1Byte(3bit,4bit,1bit填充)2Byte(5bit,3bit填充)3Byte(6bit,2bit填充)4Byte(7bit,1bit填充)
3、test3结果是3Byte。和上述两个类似
4、test4的结果是12。为什么不是4+1+1+4呢?(我这里long是4Byte),由于C++对于Byte的管理仍然要内存对齐。我这里的内存对其是4Byte。所以。内存占用是这种4Byte(Int)4Byte(char,char,2Byte填充)4Byte(long)
5、有些同学会好奇。为什么两个结构体声明换了个顺序,差了4Byte。
相同是由于内存对齐
二、字符串与char*和char数组
// testforyou.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <iostream>
#include <string>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
string s = "hellohwc";
char * s1 = "hellohwc";
char s2[] = "hellohwc";
char s3[100];
char* s4=(char*)malloc(100);
void *s5=(void*)malloc(100);
cout<<sizeof(s)<<endl;
cout<<sizeof(s1)<<endl;
cout<<sizeof(s2)<<endl;
cout<<sizeof(s3)<<endl;
cout<<sizeof(s4)<<endl;
cout<<sizeof(s5)<<endl;
return 0;
}
执行结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="500" height="250" alt="">
解释下
对于String类型。每一个编译器给分配内存的空间都是一定的。我这里是32Byte。
所以,无论字符串长度多长,内存分配都是32。当然也有4,16等情况,因编译期不同而不同。
1、char * s1,s1本身是个指针,所以长度是4个字节,跟后面指向什么没关系。
2、s2是数组保存了一个字符串。因为字符串最后一个隐藏的结束符。
所以,长度为8+1 = 9
3、s3是数组。在编译期分配了100*1 = 100Byte,所以结果是100
4、s4和s5都是指针,长度4Byte。
三、类
先看代码
// testforyou.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <iostream>
#include <string>
using namespace std; class emptyClass1{
public:
emptyClass1(){}
~emptyClass1(){}
};
class emptyClass2{
public:
emptyClass2(){}
virtual ~emptyClass2(){}
};
class hwcBase{
public:
hwcBase(){}
virtual ~hwcBase(){}
private:
int base;
}; class hwcSubFirst:hwcBase{
public:
hwcSubFirst():hwcBase(){}
~hwcSubFirst(){}
private:
int sub;
}; class hwcSubSecond:hwcBase{
public:
hwcSubSecond():hwcBase(){}
~hwcSubSecond(){}
private:
int sub;
char sub2;
}; int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(emptyClass1)<<endl;
cout<<sizeof(emptyClass2)<<endl;
cout<<sizeof(hwcBase)<<endl;
cout<<sizeof(hwcSubFirst)<<endl;
cout<<sizeof(hwcSubSecond)<<endl;
return 0;
}
执行结果
解释下:
1、对于一个空的类。在内存中要存在一个标示来区分,所以即使是空的。也要分配一个字节
2、相同是empty的类,可是有一个虚的析构函数,所以,保存了一个指针(vptr)指向虚表。
一个指针4Byte
3、hwcBase类,有一个Int占用4Byte,一个指针(vptr)。所以共占用8Byte
3、hwcSubFirst,继承来一个Int,本身有一个Int。加上一个vptr指针,共12字节
4、hwcSubSecond,和hwcSubFirst类似,可是多了一个char,考虑到内存对其。12+4 = 16字节
关于sizeof的笔试面试题具体解释的更多相关文章
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...
- 可能碰到的iOS笔试面试题(4)--C语言
可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...
- 【转】BAT及各大互联网公司2014前端笔试面试题:JavaScript篇
原文转自:http://blog.jobbole.com/78738/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是 ...
- Java笔试面试题整理第三波
转载至:http://blog.csdn.net/shakespeare001/article/details/51247785 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第一波
转载至:http://blog.csdn.net/shakespeare001/article/details/51151650 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)
(某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...
- String笔试面试题
Java中String类由于其特殊性(不变类),几乎是笔试面试中的必考题,当然有些题目其实没啥意思,不过关键是要通过题目掌握原理性的东西.下面六道题目,如果您全部做对了,且明白其所以然,那么Java中 ...
- 李洪强经典面试题40-可能碰到的iOS笔试面试题-C语言
可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...
- STL笔试面试题总结(干货)(转)
STL笔试面试题总结 一.STL有哪些组件? STL提供六大组件彼此此可以组合套用: 1.容器容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class ...
随机推荐
- linux 单网卡绑定两个ip
一.ubuntu系统: #vi /etc/network/interfaces OR $ sudo vi /etc/network/interfaces Modify as follows: au ...
- ACM比赛(第二次A)
ime Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Description There is ...
- 知识点2-5:了解Razor语法
以往开发ASP.NET Web Form时,在ASPX页面上都会出现许多夹杂C#/VB.NET与HTML的情况,而先前使用<%...%>这种传统圆角括号的表示法会让HTML标签与ASP.N ...
- SignalR系列教程:SignalR快速入门
---恢复内容开始--- 本篇是SignalR系列教程的第一篇,本篇内容介绍了如何创建SignalR应用,如何利用SignalR搭建简易的聊天室等,本篇内容参考自:http://www.asp.net ...
- 使用VirtualBox SDK之初步编译
VirtualBox成功编译出来后,在生成的out文件夹中会发现有SDK文件夹(当然也可以直接从官网下SDK),里面有例子,但是直接用Visual Studio编译的话会出一大堆错误,本文就是讲解如何 ...
- CCIE路由实验(7) -- MPLS VPN
1.LDP协议的各种情况2.LDP和BGP交互3.LDP高级部分4.MPLS VPN (RIP和静态)5.MPLS VPN (EIGRP)6.MPLS VPN (OSPF)7.MPLS VPN (EB ...
- 数据绑定以及Container.DataItem几种方式与使用方法分析
灵活的运用数据绑定操作 绑定到简单属性:<%#UserName%> 绑定到集合:<asp:ListBox id="ListBox1" ...
- Linux安装完Tomcat后无法登陆管理界面
今天在Linux中安装完Tomcat后无法登陆Tomcat的管理界面,也就无法利用Tomcat管理界面来部署项目. 在Windows中一般配置完Tomcat后,只要在[conf]目录下的“tomcat ...
- 大白痴学习webmagic
摘要 webmagic 学习 从头 刚刚开始学,很多东西可能理解错了,还请各位指教 一些基本类: Request:包含要爬行的url和一些附加信息,是Page的一个成员变量 主要成员变量 String ...
- ASP.NET中IsPostBack详解(转载)
1.IsPostBack介绍Page.IsPostBack是一个标志:当前请求是否第一次打开. 调用方法为:Page.IsPostBack或者IsPostBack或者this.IsPostBack或者 ...