原创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的笔试面试题具体解释的更多相关文章

  1. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

    很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...

  2. 可能碰到的iOS笔试面试题(4)--C语言

    可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...

  3. 【转】BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

    原文转自:http://blog.jobbole.com/78738/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是 ...

  4. Java笔试面试题整理第三波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51247785 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  5. Java笔试面试题整理第一波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51151650 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  6. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)

    (某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...

  7. String笔试面试题

    Java中String类由于其特殊性(不变类),几乎是笔试面试中的必考题,当然有些题目其实没啥意思,不过关键是要通过题目掌握原理性的东西.下面六道题目,如果您全部做对了,且明白其所以然,那么Java中 ...

  8. 李洪强经典面试题40-可能碰到的iOS笔试面试题-C语言

    可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...

  9. STL笔试面试题总结(干货)(转)

    STL笔试面试题总结 一.STL有哪些组件? STL提供六大组件彼此此可以组合套用: 1.容器容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class ...

随机推荐

  1. mysql入门记录

    mysql -h localhost(or ID) -u root -p show databases; create database <数据库名>: drop database < ...

  2. 16-UIKit(AutoLayout、Animation)

    目录: 一.AutoLayout自动布局 二.动画(Animation) 回到顶部 一.AutoLayout自动布局 1.什么是AutoLayout 从ios6开始引入的新技术,是新版的自动布局技术 ...

  3. Android 播放声音

    public static void PlayAlarmRing(Context mContext) { Uri alert = RingtoneManager.getDefaultUri(Ringt ...

  4. android软键盘的管理和属性的设置

    android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...

  5. google浙大招聘笔试题 师兄只能帮你到这儿了

    google浙大招聘笔试题 一.单选1.80x86中,十进制数-3用16位二进制数表示为?00100002.假定符号-.*.$分别代表减法.乘法和指数运算,且 1)三个运算符优先级顺序是:-最高,*其 ...

  6. c语言, objective code(new 2)

    参考: 1. C中的继承和多态 http://www.cnblogs.com/skynet/archive/2010/09/23/1833217.html

  7. ubuntu 安装 maven3.2

    1.下载并解压 apache-maven-3.2.5-bin.tar.gz tar -xzvf apache-maven--bin.tar.gz 2.设置环境变量 sudo gedit ~/.prof ...

  8. 最新OpenCV2.4.6与VS2010开发环境搭建

    OpenCV2.4.6与VS2010开发环境搭建 由于很久没有用OpenCV了,之前用的是1.0版本和VC++6.0.现在已经到了VS2010+OpenCV2.4.6.安装使用之后,发现OpenCV的 ...

  9. poj 3778

    这就是个超级水题……!!!!写一写来纪念一下自己的错误…… 如果某个学生的的成绩是其他俩个或三个学生成绩的和则给予奖励 直接暴力,所以一开始直接用数组标记两个人或三个人的和,但是忽略了这种情况 20( ...

  10. Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)

    Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...