类的大小解析 sizeof()中类的大小详解
sizeof 函数

sizeof 函数sizeof函数是C语言中的一个运算符,用于获取变量或数据类型所占用的内存空间大小。
在C语言中,sizeof函数的返回值是一个无符号整数,表示所占用的字节数。
本文将从sizeof函数的用法、计算方法、注意事项等方面进行详细介绍。
一、sizeof函数的用法sizeof函数的用法非常简单,可以用于获取变量或数据类型所占用的内存空间大小。
其语法格式如下:sizeof(表达式)其中,表达式可以是变量、常量、数据类型等。
二、sizeof函数的计算方法sizeof函数的计算方法是根据数据类型来确定所占用的字节数。
不同的数据类型在内存中占用的空间大小是固定的,因此sizeof函数可以根据数据类型来返回相应的字节数。
例如,sizeof(char)返回的是1,因为char类型占用1个字节;sizeof(int)返回的是4,因为int类型占用4个字节;sizeof(float)返回的是4,因为float类型占用4个字节;sizeof(double)返回的是8,因为double类型占用8个字节。
需要注意的是,sizeof函数返回的是字节数,而不是位数。
一个字节等于8个位,所以sizeof函数返回的结果可以用来判断数据类型的位数。
三、sizeof函数的注意事项1. sizeof函数只能用于静态类型,不能用于动态类型。
也就是说,sizeof函数不能用于动态分配的内存,比如指针指向的内存空间。
2. sizeof函数不能直接用于函数、数组和void类型。
对于函数和void类型,可以使用指针来获取其所占用的内存空间大小;对于数组,可以使用sizeof(数组名)来获取数组的总大小。
3. sizeof函数的结果是一个常量表达式,在编译时就能得到结果,因此sizeof函数的参数不会被执行。
4. sizeof函数返回的结果是一个无符号整数,可以用%lu或%zu格式输出。
四、sizeof函数的应用举例1. 获取变量的大小```cint num;size_t size = sizeof(num);printf("变量num的大小为:%zu\n", size);```2. 获取数据类型的大小```csize_t size1 = sizeof(char);size_t size2 = sizeof(int);size_t size3 = sizeof(float);size_t size4 = sizeof(double);printf("char类型的大小为:%zu\n", size1);printf("int类型的大小为:%zu\n", size2);printf("float类型的大小为:%zu\n", size3);printf("double类型的大小为:%zu\n", size4);```3. 获取数组的大小```cint arr[10];size_t size = sizeof(arr);printf("数组arr的大小为:%zu\n", size);```5. 获取指针所指向的类型的大小```cint* ptr;size_t size = sizeof(*ptr);printf("指针ptr所指向的类型的大小为:%zu\n", size);```五、总结sizeof函数是C语言中用于获取变量或数据类型所占用的内存空间大小的一个非常实用的运算符。
sizeof的用法

sizeof的用法在C语言中,sizeof是一种用于计算数据类型或变量所占用空间大小的运算符。
它可以用于计算任何数据类型或变量的大小,包括基本数据类型、数组、结构体等。
sizeof的用法非常灵活,下面我们将详细介绍它的用法和注意事项。
1. 基本数据类型的大小首先,我们来看一下基本数据类型的大小。
在C语言中,基本数据类型有char、int、float、double等。
我们可以使用sizeof运算符来计算它们的大小,例如:```printf('char类型的大小为:%d', sizeof(char));printf('int类型的大小为:%d', sizeof(int));printf('float类型的大小为:%d', sizeof(float));printf('double类型的大小为:%d', sizeof(double));```输出结果为:```char类型的大小为:1int类型的大小为:4float类型的大小为:4double类型的大小为:8```从输出结果可以看出,char类型占用1个字节,int和float类型占用4个字节,而double类型占用8个字节。
这是因为不同的数据类型在内存中占用的空间大小是不同的。
需要注意的是,sizeof返回的是一个无符号整数,因此在使用printf函数输出时需要使用%u格式符,而不是%d格式符。
2. 数组的大小接下来,我们来看一下数组的大小。
在C语言中,数组的大小等于数组元素的个数乘以每个元素的大小。
我们可以使用sizeof运算符来计算数组的大小,例如:```int a[5] = {1, 2, 3, 4, 5};printf('数组a的大小为:%u', sizeof(a));```输出结果为:```数组a的大小为:20```从输出结果可以看出,数组a的大小为20个字节,即5个int 类型的元素,每个元素占用4个字节。
sizeof原理

sizeof原理
sizeof 是一种在编程语言中用于获取数据类型或变量在内存中
所占空间大小的运算符。
它返回一个无符号整数值,表示给定类型或变量所占字节数。
在主流的编程语言中,sizeof 运算符一般用于确定特定数据类
型的大小,包括基本数据类型(如 int、float、char 等)以及
自定义的结构体、类等复杂数据类型。
其使用方法通常为sizeof(类型名) 或 sizeof(变量名)。
sizeof 运算符的原理是通过编译器对指定类型或变量进行静态
分析来确定其大小。
在编译时,编译器会根据数据类型的定义,在编译器内部的符号表中查找对应的大小信息。
对于基本数据类型,编译器通常事先就知道其大小,所以可以直接返回结果。
而对于复杂数据类型,编译器会根据其成员变量的定义来计算大小,并将其作为结果返回。
需要注意的是,sizeof 运算符返回的是一个编译时常量,其结
果在程序运行时是不会改变的。
这使得 sizeof 运算符在编写程序时可以用来动态地分配内存空间或优化代码结构,以更好地利用计算机的资源。
总之,sizeof 运算符是一种用于获取数据类型或变量所占内存
大小的编程工具,通过静态分析来计算大小,并返回一个无符号整数值。
通过 sizeof 运算符,开发者可以更好地管理内存空间,提高程序性能。
sizeof()的用法

sizeof()的⽤法1. 定义sizeof 是⼀个操作符 operator,不是⼀个函数,其作⽤是返回⼀个对象或类型所占的内存字节数---------------------------------------------------------------------------------------------------------2. 语法sizeof object; //sizeof 对象sizeof(object);sizeof(type_name); // 例如 sizeof(int)对象 object 可以是各种类型的变量,以及表达式(⼀般sizeof不会对表达式进⾏计算);sizeof对对象求内存⼤⼩,最终都是转化为对对象的数据类型进⾏求值;sizeof(表达式) 值为表达式的最终结果的数据类型的⼤⼩int i;sizeof(int); //值为4sizeof(i); //值为4,等价于sizeof(int)sizeof i; //值为4sizeof(2); //值为4,等价于sizeof(int),因为2的类型为intsizeof(2 + 3.14); //值为8,等价于sizeof(double),因为此表达式的结果的类型为doublechar ary[sizeof(int) * 10]; //OK,编译⽆误---------------------------------------------------------------------------------------------------------3. 基本数据类型的sizeof基本数据类型如int short long char double等,其内存⼤⼩与系统有关。
32位系统的int(4 Bytes), short(2 Bytes), long(4 Bytes), char(1 Bytes), double(8 Bytes), float(4 Bytes)4. 结构体的sizeof结构体的sizeof涉及到字节对齐问题,字节对齐有助于加快计算机的存取速度,减⼩指令周期。
sizeof()的使用及各种数据类型的字节大小

sizeof()的使⽤及各种数据类型的字节⼤⼩1、什么是sizeof ⾸先看⼀下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 看到return这个字眼,是不是想到了函数?错了,sizeof不是⼀个函数,你见过给⼀个函数传参数,⽽不加括号的吗?sizeof可以,所以sizeof不是函数。
⽹上有⼈说sizeof是⼀元操作符,但是我并不这么认为,因为sizeof更像⼀个特殊的宏,它是在编译阶段求值的。
举个例⼦:cout<<sizeof(int)<<endl; // 32位机上int长度为4cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl; 在编译阶段已经被翻译为:cout<<4<<endl;cout<<1<<endl; 这⾥有个陷阱,看下⾯的程序:int a = 0;cout<<sizeof(a=3)<<endl;cout<<a<<endl; 输出为什么是4,0⽽不是期望中的4,3???就在于sizeof在编译阶段处理的特性。
由于sizeof不能被编译成机器码,所以sizeof作⽤范围内,也就是()⾥⾯的内容也不能被编译,⽽是被替换成类型。
=操作符返回左操作数的类型,所以a=3相当于int,⽽代码也被替换为:int a = 0;cout<<4<<endl;cout<<a<<endl; 所以,sizeof是不可能⽀持链式表达式的,这也是和⼀元操作符不⼀样的地⽅。
sizeof结构体类型

sizeof结构体类型sizeof是C语言中的一个关键字,用于获取数据类型或变量的大小。
在C语言中,每个数据类型都有固定的大小,sizeof可以返回该数据类型或变量所占用的字节数。
通过sizeof,我们可以了解到不同数据类型的大小,为程序的优化和内存管理提供帮助。
结构体是C语言中的一种复合数据类型,可以将多个不同类型的变量组合在一起,形成一个新的数据类型。
结构体可以包含不同类型的成员变量,这些成员变量可以是基本数据类型(如int、float等),也可以是其他结构体类型。
使用结构体可以方便地将相关数据组织在一起,提高代码的可读性和可维护性。
在使用sizeof获取结构体类型的大小时,sizeof会计算结构体中所有成员变量的大小,并将它们累加起来。
需要注意的是,由于编译器对结构体进行了对齐操作,所以结构体的实际大小可能会大于成员变量的累加大小。
例如,我们定义了一个名为Person的结构体,它包含了姓名、年龄和身高三个成员变量:```ctypedef struct {char name[20];int age;float height;} Person;```我们可以使用sizeof获取Person结构体的大小:```csize_t size = sizeof(Person);```上述代码中,size_t是一个无符号整数类型,用于存储sizeof的结果。
通过sizeof(Person),我们可以得到Person结构体的大小。
在实际编程中,我们经常会使用sizeof来确定数组的大小,或者为动态内存分配提供参数。
sizeof是一个非常有用的操作符,它可以帮助我们更好地理解和管理内存。
sizeof结构体类型是C语言中的一个关键字,用于获取结构体类型的大小。
它可以帮助我们了解不同数据类型的大小,为程序的优化和内存管理提供帮助。
在使用sizeof时,需要注意结构体成员变量的对齐和内存占用的问题。
使用sizeof可以提高代码的可读性和可维护性,是C语言中常用的操作符之一。
sizeof 计算表达式

sizeof 计算表达式sizeof 是C语言中的一个操作符,用于计算变量或数据类型所占用的字节数。
通过sizeof 可以在编程中准确地获取变量或数据类型的字节大小,从而在内存管理和数据处理中起到重要的作用。
在C语言中,sizeof 是一个单目运算符,用于计算操作数的字节大小。
sizeof 可以用于计算各种数据类型的字节大小,包括基本数据类型、数组、结构体等。
下面是几个常见的sizeof 用法示例:1. 计算基本数据类型的字节大小:sizeof(int):计算int 类型的字节大小,一般为4个字节。
sizeof(float):计算float 类型的字节大小,一般为4个字节。
sizeof(double):计算double 类型的字节大小,一般为8个字节。
sizeof(char):计算char 类型的字节大小,一般为1个字节。
2. 计算数组的字节大小:int arr[5] = {1, 2, 3, 4, 5};int size = sizeof(arr); // 计算数组arr 的字节大小,一般为20个字节(5个int 类型元素,每个元素占用4个字节)。
3. 计算结构体的字节大小:struct Student {int id;char name[20];float score;};struct Student stu;int size = sizeof(stu); // 计算结构体stu 的字节大小,一般为28个字节(4个字节的int 类型,20个字节的char 数组,4个字节的float 类型)。
sizeof 运算符返回的结果是一个整数值,表示操作数所占用的字节数。
sizeof 运算符在编译时求值,不会对操作数进行实际计算,因此可以用于在程序中动态获取数据类型的字节大小。
需要注意的是,sizeof 运算符计算的是类型的字节大小,而不是变量的实际大小。
对于指针类型的变量,sizeof 运算符计算的是指针本身的字节大小,而不是指针所指向的数据类型的字节大小。
C++类的大小——sizeof(class)

C++类的大小——sizeof(class)C++类的大小——sizeof(class)第一:空类的大小运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;sizeof(CBase)=1;为什么空的什么都没有是1呢?先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。
同样空类也会被实例化(别拿豆包不当干粮,空类也是类啊),所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。
所以空类的sizeof为1。
第二:一般非空类大小后输出什么?运行结果:sizeof(CBase)=8第三:有虚函数类再运行:sizeof(CBase)=12“C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节”。
第四步:有虚函数类的继承基类就是上面的了不写了运行:cout<<"sizeof(CChild)="<<sizeof(CChild)<<endl;输出:sizeof(CChild)=16;可见子类的大小是本身成员变量的大小加上子类的大小。
############################################# ######另外:1. 空类class A{};void main(){printf("sizeof(A): %d\n", sizeof(A));getchar();}得到结果为:1。
类的实例化就是给每个实例在内存中分配一块地址。
空类被实例化时,会由编译器隐含的添加一个字节。
所以空类的size为1。
2.虚函数class A{virtual void FuncA();<br> virtual void FuncB();};得到结果:4当C++ 类中有虚函数的时候,会有一个指向虚函数表的指针(vp tr),在32位系统分配指针大小为4字节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、空类的sizeof是1。
空类是指没有成员的类,类中的函数不占空间,除非是虚函数。
如:class A
{
public:
A(){}
~A(){}
void fun(){}
};
sizeof(A)是1.
注:class A1
{
public:
A1(){}
~A1(){}
void fun(){}
char a[0];
};
sizeof(A1)也是1.(VC6.0下编译)
2、若类中包含成员,则类对象的大小只包括其中非静态成员经过对齐所占的空间,对齐方式和结构体相同。
如:
class A
{
public:
int b;
float c;
char d;
};
sizeof(A)是12.
class A
{
public:
static int a;
int b;
float c;
char d;
};
sizeof(A)是12.
class A
{
public:
static int a;
int b;
float c;
char d;
int add(int x,int y)
{
return x+y;
}
sizeof(A)也是12.
3、若类中包含虚函数,则无论有几个虚函数,sizeof类都等于sizeof(数据成员)的和+sizeof(V表指针,为4),如:
class Base
{
public:
Base(){cout<<"Base-ctor"<<endl;}
~Base(){cout<<"Base-dtor"<<endl;}
int a;
virtual void f(int) {cout<<"Base::f(int)"<<endl;}
virtual void f(double){cout<<"Base::f(double)"<<endl;} };
sizeof(Base)为8.
4、对于子类,它的sizeof是它父类成员(无论成员是public或private),再加上它自己的成员,对齐后的sizeof,如:
class A2
{
public:
int a;
private:
char b;
};
class A3:public A2
public:
char b;
short a;
};
sizeof(A3)是8. 但如果A3如下:
class A3:public A2
{
public:
short a;
char b;
};
sizeof(A3)是12.
5、对于子类和父类中都有虚函数的情况,子类的sizeof是它父类成员(无论成员是public或private),再加上它自己的成员,对齐后的sizeof,再加4(虚表指针)。
如:
class Base
{
public:
Base(){cout<<"Base-ctor"<<endl;}
~Base(){cout<<"Base-dtor"<<endl;}
int a;
virtual void f(int) {cout<<"Base::f(int)"<<endl;}
virtual void f(double){cout<<"Base::f(double)"<<endl;} };
class Derived:public Base
public:
Derived(){cout<<"Derived-ctor"<<endl;}
int b;
virtual void g(int){cout<<"Derived::g(int)"<<endl;}
};
sizeof(Derived)是12.
6、对于虚继承的子类,其sizeof的值是其父类成员,加上它自己的成员,以及它自己一个指向父类的指针(大小为4),对齐后的sizeof。
如:#include <iostream.h>
class a
{
private:
int x;
};
class b: virtual public a
{
private:
int y;
};
class c: virtual public a
{
private:
int z;
};
class d:public b,public c
{
private:
int m;
};
int main(int argc, char* argv[])
{
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
return 0;
}
在VC6.0下调试结果为
4
12
12
24
sizeof(b)和sizeof(c)相同,都是4+4+4=12。
sizeof(d)是sizeof(b)(为12)+sizeof(c)(为12)-b和c相同的部分(a的成员,大小是4)+d自己的成员(大小为4)=24
7、对于既有虚继承又有虚函数的子类,其sizeof的值是其父类成员(计算虚表指针大小+4),加上它自己的成员(计算虚表指针大小+4),以及它自己一个指向父类的指针(大小为4),对齐后的sizeof
class Base
{
public:
Base(){cout<<"Base-ctor"<<endl;}
~Base(){cout<<"Base-dtor"<<endl;}
virtual void f(int) {cout<<"Base::f(int)"<<endl;}
virtual void f(double){cout<<"Base::f(double)"<<endl;}
};
class Derived:virtual public Base
{
public:
Derived(){cout<<"Derived-ctor"<<endl;}
virtual void g(int){cout<<"Derived::g(int)"<<endl;}
};
sizeof(Base)=4
sizeof(Derived)=12 (父类虚表指针大小4+自己虚表指针大小4+子类指向父类的一个指针大小4=12)。