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,其值在编译时即计算好了, ...
随机推荐
- JavaScript入门学习笔记(JSON)
JSON是JavaScript Object Notation的简称,是一种轻量级的数据交换格式. JSON使用JS的语法,但其格式只是一个文本,可以被任何编程语言读取病作为数据格式传递. JSON以 ...
- Bag of Tricks for Image Classification with Convolutional Neural Networks论文笔记
一.高效的训练 1.Large-batch training 使用大的batch size可能会减小训练过程(收敛的慢?我之前训练的时候挺喜欢用较大的batch size),即在相同的迭代次数 ...
- 传输层的端口与TCP标志中的URG和PSH位
一.协议端口号的提出 运输层提供了进程间通信的能力(即端-端通信).但是不同的操作系统可能无法识别其他机器上的进程.为了用统一的方法对 TCP/IP体系的应用进程进行标志,使运行不同操作系统的计算机的 ...
- Centos系统中彻底删除Mysql数据库
步骤: 1.输入命令查询系统中已安装的mysql. rpm -qa |grep -i mysql 2.逐个卸载mysql. yum remove 系统显示已安装的mysql 比如:yum remove ...
- 你好!酷痞 Coolpy
欢迎你进入酷痞的物联网世界.这里有着自由的空气和自然的气息.接下来我将告诉你如果一步步建立一个自己专属的物联网平台. 由于目前的酷痞的官方域名还没有通过备案所以现在用临时域名解说本说明. 最终酷痞的官 ...
- 2018-2019-1 20189201 《LInux内核原理与分析》第七周作业
我的愿望是 好好学习Linux 一.书本第六章知识总结[进程的描述和进程的创建] 基础知识1 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚 ...
- Service的绑定过程
--摘自<Android进阶解密> 第一步:ContextImpl到AMS的调用过程 第二步:Service的绑定过程 1)几个与Service相关的对象类型 * ServiceRecor ...
- 网络编程-Python高级语法-GIL全局解释器锁
知识点:GIL全局解释器锁其实和Python没有任何关系,是由于当初编写Python解释器时留下的,它只对多线程有影响,GIL保证同一时刻只有一个线程在运行,即使是多核配置电脑,同一时刻也只会让一个线 ...
- 一道简单的dp题 --- Greenhouse Effect CodeForces - 269B
题目链接: https://vjudge.net/problem/36696/origin 题目大意: 要求从1到m升序排列,点可以随意移动,问最少需要移动多少次, 思路: 动态规划 可以推出转移方程 ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...