例一:

#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操作符的一些例子的更多相关文章

  1. sizeof操作符-结构体与类大小

    导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...

  2. C语言strlen函数和sizeof操作符

    字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...

  3. C++ sizeof操作符的用法和strlen函数的区别

    摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和 ...

  4. 字符串 前篇 ---- sizeof()操作符和strlen()库函数

    本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...

  5. C++中sizeof操作符与strlen函数

    sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof ...

  6. C++ sizeof 操作符的用法总结

    在VC中,sizeof有着许多的用法,而且很容易引起一些错误.下面根据sizeof后面的参数对sizeof的用法做个总结. A.参数为数据类型或者为一般变量: 例如sizeof(int),sizeof ...

  7. C安全问题与指针误用

    欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 指针的声明与初始化 1.不恰当的指针声明 考虑如下的声明: int* ptr1, ptr2; // ptr1为指针,pt ...

  8. Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)

    Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是:  i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...

  9. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

随机推荐

  1. sort algorithms

    //todo #include<iostream> void swap(int *a, int *b){int temp = *a; *a = *b; *b = temp;} ; i &l ...

  2. 【剑指offer】【python】面试题2~5

    使用python实现<剑指offer>面试题ヾ(◍°∇°◍)ノ゙,以此记录. 2_实现Singleton模式 题目:实现单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含 ...

  3. H2 Database Engine

    http://www.h2database.com/html/main.html H2 Database Engine Welcome to H2, the Java SQL database. Th ...

  4. php 1转成一

    function numToWord($num) { $chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九'); $chiUn ...

  5. vector 的用法--------------自绘资源

    创建 命名 选择根元素 当然你也可以选择其他元素 属性介绍vector 元素 name:定义该矢量图形的名字.通过名字找到这个矢量图width,height:定义该矢量图形的固有宽高(必须的,矢量图内 ...

  6. Vue项目中,要保证某个部分的高度,应该怎么设置

    .icons overflow: hidden height: padding-bottom: % background: green

  7. setInterval动态时间处理

  8. JDBC 返回主键

    转载至:https://www.liyongzhen.com/ 上一节课里我们学习通过PreparedStatement对象执行带参数的查询SQL和修改SQL. 这节课我们学习使用 PreparedS ...

  9. 一 .isinstance(obj,cls)和issubclass(sub,super)

    class Foo: pass class Bar(Foo): pass obj = Bar() isinstance(obj,cls)检查是否obj是否是类 cls 的对象 print(isinst ...

  10. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...