sizeof操作符的一些例子
例一:
#include <iostream>
using namespace std; class A
{
public:
char c;
}; class B
{
public:
int a;
short b;
}; class C
{
public:
int a;
short b;
char c;
}; class D
{
public:
int a;
short b;
char c;
char d;
}; class E
{
public:
int a;
short b;
char c;
char d;
char e;
}; int main()
{
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;
return ;
}
输出:

这里是32位机器,sizeof(B)=8,sizeof(C)=8,sizeof(E)=12的原因是字节对齐,编译器会在最末一个成员之后填充字节。
例二:
#include <iostream>
using namespace std; class Base
{
public:
Base(int x) : a(x)
{}
void print()
{
cout << "Base" << endl;
}
private:
int a;
}; class Derived : public Base
{
public:
Derived(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;
}
private:
int b;
}; int main()
{
cout<< "sizeof(Base) = " <<sizeof(Base) << endl;
cout<< "sizeof(Derived) = " <<sizeof(Derived) << endl;
cout<< "sizeof(A) = " <<sizeof(A) << endl;
cout<< "sizeof(B) = " <<sizeof(B) << endl;
return ;
}
输出:

sizeof(Base)=4,int占4字节,print()函数不占内存;
sizeof(Derived)=8,比Base多一个int成员;
sizeof(A)=8,int占4字节,但是含有虚函数,包含了一个隐含的虚表指针成员,占4字节,共计8字节;
sizeof(B)=12,比A多一个int成员,共计12字节;
这里可能会存在一个疑问:B中也存在一个指向虚函数表的指针,所以应该是16字节。
解释:虚表指针(vptr)是作为对象的一部分存在于对象的空间中,一个类只有一个虚表指针,所以A中的虚表指针和B中的虚表指针是同一个,所以是12字节。
例三:
#include <iostream>
using namespace std; class A
{
}; class B
{
}; class C : public A, public B
{
}; class D : virtual public A
{
}; class E : virtual public A, virtual public B
{
}; class F : public D
{
}; class G
{
public:
int a;
static int b;
}; int main()
{
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;
cout<< "sizeof(G) = " <<sizeof(G) << endl;
return ;
}
输出:

sizeof(A) = 1,类A是空类,编译器会安插一个char空类,标记它的每一个对象,因此为1字节;
sizeof(B) = 1,同上;
sizeof(C) = 1,类C多重继承类A和类B,大小仍然为1字节;
sizeof(D) = 4,类D虚继承自A,编译器安插了一个指向父类的指针,大小为4字节;
sizeof(E) = 4,类E虚继承自A和B,因此它有指向父类A和父类B的指针,加起来为8字节。注意:在GNU编译器下编译字节是4字节;
sizeof(F) = 4,类F继承D,大小为4字节;
sizeof(G) = 4,类G有一个static成员,这个静态成员不在类的实例中,而是像全局变量一样在静态存储区中,被类G共享,所以只计算一个int成员,为4字节;
PS:如果在A中加入char a;
输出:sizeof(D) = 8 sizeof(E) = 8 sizeof(F) = 8 ,理由是字节对齐。
例四:
#include <iostream>
using namespace std; union u1
{
double a;
int b;
}; union u2
{
char a[];
int b;
}; union u3
{
char a[];
char b;
}; int main()
{
cout<< "sizeof(u1) = " <<sizeof(u1) << endl;
cout<< "sizeof(u2) = " <<sizeof(u2) << endl;
cout<< "sizeof(u3) = " <<sizeof(u3) << endl;
return ;
}
输出:

这里定义了三个联合体。联合体的大小取决于它所有成员中占用空间最大的一个成员的大小。对于符合数据类型,例如union,struct,class,对齐方式为成员中最大成员的对齐方式。
sizeof(u1) = 8,最大成员为double a,为8;
sizeof(u2) = 16,最大成员是char[13]的数组,但由于另一个成员int b,使u2的对齐方式变成4,所以u2的大小为4的倍数,所以占用的空间由13对齐成16;
sizeof(u3) = 13,最大成员是char[13]的数组,另一个成员char b,所以大小为13;
例五:(查看32位和64位机器字节大小)
#include <iostream>
using namespace std; int main()
{
cout<< "sizeof(char) = " <<sizeof(char) << endl;
cout<< "sizeof(short) = " <<sizeof(short) << endl;
cout<< "sizeof(int) = " << sizeof(int) <<endl;
cout<< "sizeof(double) = " <<sizeof(double) << endl;
cout<< "sizeof(long) = " <<sizeof(long) << endl;
cout<< "sizeof(longlong) = " <<sizeof(long long) << endl; cout<< "sizeof(void*) = " << sizeof(void*) <<endl;
cout<< "sizeof(char*) = " << sizeof(char*) <<endl; cout<< "当前系统是sizeof(void*) * 8 = " << sizeof(void*)*<<"位"<<endl; return ;
}
32位输出:

64位输出:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(double) = 8
sizeof(long) = 8
sizeof(longlong) = 8
sizeof(void*) = 8
sizeof(char*) = 8
当前系统是sizeof(void*) * 8 = 64位
说明:
1.long型变量在32位是4字节,64位是8字节
2.指针变量在32位是4字节,64位是8字节
sizeof操作符的一些例子的更多相关文章
- sizeof操作符-结构体与类大小
导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...
- C语言strlen函数和sizeof操作符
字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...
- C++ sizeof操作符的用法和strlen函数的区别
摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和 ...
- 字符串 前篇 ---- sizeof()操作符和strlen()库函数
本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...
- C++中sizeof操作符与strlen函数
sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof ...
- C++ sizeof 操作符的用法总结
在VC中,sizeof有着许多的用法,而且很容易引起一些错误.下面根据sizeof后面的参数对sizeof的用法做个总结. A.参数为数据类型或者为一般变量: 例如sizeof(int),sizeof ...
- C安全问题与指针误用
欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 指针的声明与初始化 1.不恰当的指针声明 考虑如下的声明: int* ptr1, ptr2; // ptr1为指针,pt ...
- Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)
Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是: i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...
- sizeof和strlen的区别
一.sizeof sizeof(...)是运算符,而不是一个函数. sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...
随机推荐
- 第二周 数据分析之展示 Matplotlib基础绘图函数实例
Pyplot基础图表函数 Pyplot饼图的绘制: Pyplot直方图的绘制: Pyplot极坐标图的绘制: Pyplot散点图的绘制: 单元小结: import numpy as np import ...
- iOS 推荐几篇关于Objective-c 动态语言的文章
http://www.cnblogs.com/Mr-Lin/p/5771969.html https://onevcat.com/2012/04/objective-c-runtime/ 我摘抄几句比 ...
- hadoop的master和slave模式
hadoop的集群是基于master/slave模式. namenode和jobtracker属于master,datanode和tasktracker属于slave,master只有一个,而slav ...
- matplotlib学习笔记
1.简介 matplotlib是python的一个2D绘图库,它可以在不同平台上地使用多种通用的绘图格式(hardcopy formats)和交互环境绘制出出版物质量级别的图片.matplotlib可 ...
- Apache:SSLCertificateFile:文件不存在或为空(操作系统RHEL7)
配置参数及报错信息(配置了TLS加密后httpd服务无法启动) 我在httpd.conf文件中引用了上面创建的文件.但在那之后,当我尝试RESTART Apache时,我遇到以下错误: 错误:SSLC ...
- 基于Python Django开发的一个mock
最近研究了一下python的django框架, 发现这个框架不比Java spring boot差, mock同样一个接口, 代码量少很多, 维护起来也很方便, 废话不多说,直接上代码 1. 安装dj ...
- mysql查看索引与锁
http://www.cnblogs.com/cocos/archive/2011/05/06/2039428.html Mysql乐观锁与悲观锁 http://www.cnblogs.com/esi ...
- SQL反模式学习笔记6 支持可变属性【实体-属性-值】
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
- SparkCore| 算子
RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个弹性的.不可变.可分区.里面的元素可并行 ...
- 关于python3.6上传文件时报错:HTTPSConnectionPool(host='***.org', port=443): Max retries exceeded with url: /post (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAIL解决办法
第一个报错: 最近在练习post请求中上传文件时遇到了一个奇葩事情,两台电脑上写了一模一样的代码,一个运行正常,另一个一片红. 最后了解了一下原因以及解决办法.先记录下关键代码: files = {& ...