关于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 ...
随机推荐
- 关于std::string
主要注意的一个问题是:std::string 实际是类似一个 vector<char>的结构. 它里面是可以存放 ascii为0 的字符不算结尾 (否则 unicode方式的编码存放就有问 ...
- 常见的transformation 和 Action
常见transformation map 将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD filter 对RDD中每个元素进行判断,如果返回true则保留,返回fa ...
- word2013 无endnote选项卡咋办
word2013 无endnote选项卡咋办? 前提: 已经安装了endnotex7,office word2013 word->文件->选项->加载项->最下面的 管理 &q ...
- Arcgis镶嵌数据集java代码操作
转自:http://www.cdtarena.com/javapx/201307/9105.html 镶嵌数据集结合了之前arcgis管理影像的栅格目录和栅格数据集,为解决海量影像管理提供了很好的方案 ...
- IntelliJ IDEA 开发swing(一)
原文:idea开发swing(一) 最近项目组需要开发一个swing小工具,以下是开发过程. 一.创建工程: 输入工程名称,选择java module,点击next 接下来什么都不选点击finish, ...
- HDU4707:Pet(DFS)
Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He ...
- 在开发 ExtJS 应用程序常犯的 10 个错误
这是 CNX 公司在开发 ExtJS 项目中总结的需要特别注意的 10 个地方.有时候,我们完全是自己使用 ExtJS 从零开始构建的新的应用程序,但有时候我们的客户会要求我们使用他们自己的代码,并且 ...
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
- Java中Timer和TimerTask的使用
转自:http://www.cdtarena.com/javapx/201306/8893.html java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个 ...
- 前端面试题整理(css)
1.介绍所知道的CSS hack技巧(如:_, *, +, \9, !important 之类). CSS hack的原理: 由于不同的浏览器和浏览器各版本对CSS的支持及解析结果不一样,以及CSS优 ...