sizeof与类

问:定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果为?

答:1。

问:为什么不是0?

答:空类型的实例中不包含任何信息,本来求其sizeof应为0,但当声明该类型的实例时,它必须在内存中占有一定的空间,否则无法使用

  这些实例。而其所占空间的大小,由编译器决定。VS中,每个空类型的实例占用1字节的空间。【linux下实践也为1】

问:如果在该类型中添加一个构造函数和析构函数,再对该类型求sizeof,得到的结果为?

答:仍为1。因为调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与类型的的实例无关,编译器

  也不会因为这两个函数而在实例内添加任何额外的信息。

问:如果把析构函数标记为虚函数呢?

答:C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。

  在32位机器上,一个指针占4字节的空间,因此求sizeof为4;同样的,64位机器上,一个指针占8个字节,求sizeof为8。 

总结:类的sizeof一般是看类的非静态、非全局成员,但涉及虚函数、虚继承就会有所不同。 如果有虚函数,就应该加上一个指向虚表的指针。

参考:《剑指offer》

   虚表机制

   

时间: 2024-10-05 08:44:33

sizeof与类的相关文章

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

sizeof(类)

类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小.首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址 用sizeof对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节.后者依赖于不同的编译器实现,C++标准对此不做任何保证. 确定类大小的几个原则: 为类的非静态成员数

sizeof求类的大小

用sizeof求类的大小,http://blog.csdn.net/szchtx/article/details/1025400,这篇博文给出了非常详尽的举例介绍. 但是细心的我还是发现了一个小瑕疵,那就是对如下例子求sizeof(B),在VS下是16不是12! class A { public: int a; private: char b; }; class B : public A { public: int d; char c; }; 以下是我根据上机实验结果,总结的精华要点,希望从此以

sizeof(class)---类的字节长度

上代码: // test_max.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> using namespace std; class A { public: void fun1(){}; void fun2(){}; }; class B { public: void fun1(int i=10){}; void fun2(){}; public: char c; int a; }; class C

C存储类、链接小结

参考<C Primmer Plus> 首先唠唠C语言关键字: 数据类型14个:            void,  char(1字节),  int(4字节), short(2字节),  long(4字节),  signed(4字节), unsigned(4字节),            float(4字节),  double(8字节),  struct, union, enum, typedef, sizeof 存储类控制类型6个:            auto, static, exter

sizeof()使用技巧

描述 sizeof()是C语言的一种单目运算符,它并不是函数. 1 作用: 以字节形式给出sizeof操作数的存储大小.操作数可以是一个表达式.基础类型.结构体.类类型等. 2 特点: sizeof 是一个单目运算符,用于计算操作数的存储大小,在编译阶段就已经求值. 看如下代码 int a = 0; int nSize1 = sizeof(a = 3); cout << nSize1 << endl; cout << a << endl; 若不清楚其中的原理

Sizeof的计算看内存分配

本文记录了有关sizeof的一些计算,主要有下面的四种情况:(如有错误,敬请留言) 使用sizeof()计算普通变量所占用的内存空间 sizeof计算类对象所占用空间的大小-用到了字节对齐 sixeof计算含有虚函数的类对象的空间大小 sizeof计算虚拟继承的类对象的空间大小 使用sizeof()计算普通变量所占用的内存空间 #include <iostream> #include <stdlib.h> using namespace std; //如果数组变量被传入函数中做si

C++中怎么求类的大小?以及内存对齐原理(面试官经常问到的问题)

<pre name="code" class="cpp">#include<iostream> using namespace std; int main(){ class S{}; cout<<sizeof(S); return 0; } 程序居然输出为1!到底是怎么回事?首先我在这里要声明一点--类在未初始化之前确实不会分配空间,这里探讨的是sizeof(类)的问题,详细情况看下面的例子 C++中的类所占内存空间总结 类所占内

全面解析sizeof(下)

以下代码使用平台是Windows7 64bits+VS2012. sizeof计算结构体sizeof作用于基本数据类型,在特定的平台和特定的编译中,结果是确定的,如果使用sizeof计算构造类型:结构体.联合体和类的大小时,情况稍微复杂一下. 1.sizeof计算结构体 考察如下代码: struct S1 { char c; int i; }; cout<<"sizeof(S1)="<<sizeof(S1)<<endl; sizeof(S1)结果是8