sizeof计算含有虚函数的类的空间大小
sizeof函数用法
sizeof函数用法sizeof函数是C语言中非常常用的一个函数,它主要用于计算数据类型或变量的大小。
在C语言中,sizeof函数的语法格式为sizeof(表达式),其中表达式可以是数据类型、变量或者表达式。
sizeof函数返回的是一个unsigned int类型的值,表示表达式所占用的字节数。
在实际使用中,sizeof函数通常用于动态分配内存空间、计算数组的长度以及判断数据类型的大小。
首先,sizeof函数可以用来计算数据类型的大小。
例如,sizeof(int)会返回int类型所占用的字节数,通常为4个字节。
sizeof(char)会返回char类型所占用的字节数,通常为1个字节。
sizeof(float)会返回float类型所占用的字节数,通常为4个字节。
通过sizeof函数,我们可以在不同的平台上准确地获取数据类型的大小,从而编写更加通用的代码。
其次,sizeof函数还可以用来计算变量的大小。
例如,如果有一个整型变量int num,可以通过sizeof(num)来获取num所占用的字节数,通常为4个字节。
这在编写程序时非常有用,可以帮助我们动态地分配内存空间,确保变量的大小符合需求。
另外,sizeof函数还可以用来计算数组的长度。
在C语言中,数组的长度可以通过sizeof(array) / sizeof(array[0])来计算,其中array为数组的名称。
这个用法非常常见,可以帮助我们在不知道数组长度的情况下准确地获取数组的长度,从而避免数组越界的错误。
总的来说,sizeof函数在C语言中是一个非常有用的函数,可以帮助我们获取数据类型的大小、变量的大小以及数组的长度。
通过sizeof函数,我们可以编写更加通用、健壮的代码,提高程序的可读性和可维护性。
因此,熟练掌握sizeof函数的用法对于C语言程序员来说是非常重要的。
c++中关于结构体长度的计算问题
[C++]字节对齐与结构体大小[C++] 2010-09-24 21:40:26 阅读172 评论0 字号:大中小订阅说明:结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。
这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于误导他人。
一、解释现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
各个硬件平台对存储空间的处理上有很大的不同。
一些平台对某些特定类型的数据只能从某些特定地址开始存取。
比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。
二、准则其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
C++中虚函数工作原理和(虚)继承类的内存占用大小计算一、虚函数的工作原理虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。
典型情况下,这一信息具有一种被称为vptr(virtual table pointer,虚函数表指针)的指针的形式。
vptr 指向一个被称为vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到vtbl。
当一个对象调用了虚函数,实际的被调用函数通过下面的步骤确定:找到对象的vptr 指向的vtbl,然后在vtbl 中寻找合适的函数指针。
虚拟函数的地址翻译取决于对象的内存地址,而不取决于数据类型(编译器对函数调用的合法性检查取决于数据类型)。
如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表,即vtable。
而在类的对象地址空间中存储一个该虚表的入口,占4个字节,这个入口地址是在构造对象时由编译器写入的。
所以,由于对象的内存空间包含了虚表入口,编译器能够由这个入口找到恰当的虚函数,这个函数的地址不再由数据类型决定了。
故对于一个父类的对象指针,调用虚拟函数,如果给他赋父类对象的指针,那么他就调用父类中的函数,如果给他赋子类对象的指针,他就调用子类中的函数(取决于对象的内存地址)。
虚函数需要注意的大概就是这些个地方了,之前在More effective C++上好像也有见过,不过这次在Visual C++权威剖析这本书中有了更直白的认识,这本书名字很牛逼,看看内容也就那么回事,感觉名不副实,不过说起来也是有其独到之处的,否则也没必要出这种书了。
每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时,编译器就会为这个类创建一个虚函数表(VTABLE)保存该类所有虚函数的地址,其实这个VTABLE的作用就是保存自己类中所有虚函数的地址,可以把VTABLE形象地看成一个函数指针数组,这个数组的每个元素存放的就是虚函数的地址。
sizeof 大全
sizeof 大全Andrew Huang<bluedrum@>内容提要l sizeof操作综述l sizeof()各种样例n基本类型n不同CPU/操作系统的变型n静态/动态空间n指针n复合数据类型n位域n C++对象l sizeof()练习sizeof操作综述sizeof是C关键字,sizeof()是单目表达式,其基本用法是求一个数据类型或表达式所占存储空间的字节数.由于C可以定义很复杂的数据结构,sizeof的求值也会有各种复杂的计算.因此很多面试题通常用人工计算sizeof()的结果,以检验开发者对C语言各个方面的掌握程度.首先要确认一点,sizeof()的结果依赖于CPU的字长和操作系统本身的设置.如常用的32位CPU的字长就是32bit,一般Windows操作系统下,这样整数(int)和长整数(long)均为32bit 即4字节长,而short型为2字节长.但是dos下,Turbo C的sizeof(int)=sizeof(short)=2.(待求证) 在64位的CPU下,字长为64bit,但是基本类型int很多时候为保持软件兼容性,仍然是4个byte.只在Windows下的_int64和Linux 的long long 类型才是64bit,即8个字节.因此,求sizeof()结果,必须要首先明确CPU的类型,有时还要确定操作系统.如果是嵌入式软件开发人员的测试,没有指出环境可以认为是有错的.下列各种类型,如果没有特别指明,都是32 bit CPU ,Windows操作系统.sizeof()样例基本类型sizeof()主要能对两类对象进行操作,l sizeof(数据类型)数据类型可以是基本数据类型,如char,int,也可以是复合或自定义的数据类型,如结构等.l sizeof(表达式)表达式,首先要对表达式求值.然后再计算结果的数据类型的宽度.如果是常量表达式,还需要牵涉到常量会被默认转换类型的问题.l sizeof 表达式用于表达式,sizeof操作可以写成这样sizeof var_name如int aa; printf(“%d\n”,sizeof aa);在32位CPU下,假设Windows(Linux也一样),将会有如下基本数据类型取值sizeof(char) = 1 ; sizeof(unsigned char)= 1sizeof(short)= 2 ; sizeof(unsigned short)= 2sizeof(int)= 4 ; sizeof(unsigned int)= 4sizeof(long)= 4 ; sizeof(unsigned long)= 4sizeof(void *)= 4 ; //所有的指针都是4Byte宽度.sizeof(float) =4; sizeof(double) = 8;表达式的求类型宽度是以表达式结果类型为准int aa; sizeof(aa) = 4;如果是常量表达式,则有一个默认类型转换问题所有整数常量默认转换为整数, 所以sizeof(20) = 4所有小数默认为转换为double型,所以sizeof(20.1) = 8不同体系结构的sizeof取值对于不同字长的CPU和操作系统,用sizeof()对同一类型的取值有不同结果.特别是在嵌入式开发领域,经常要面对不同环境.因此在不同环境下同一类型宽度取值,必须有所了解.除了上节的32位CPU的提示以外.以下在几种特殊环境的各种类型的取值l8位单片机开发环境:Keil μVision3 v3.53CPU: 基于8051的Atmel A T89S52单片机无法直接对类型进行sizeof操作,因此采用第二种操作,即对变量进行sizeof 操作以下是在这个环境的实测结果.C 编程语言并没有提供一种机制来添加新的基本数据类型,因此在新的CPU下,C语言只能修改相应基本数据类型(即修改long之类数据宽度).或者添加新的基本类型(如增加long long类型). C/C++仅仅定义了这些基本数据类型之间的关系,并没有定义严格定义它们的字长。
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涉及到字节对齐问题,字节对齐有助于加快计算机的存取速度,减⼩指令周期。
C与C++经典面试题(内存泄露)
C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。
3.4一个类有基类、内部有一个其他类的成员对象,构造函数的执行顺序是怎样的。(Autodesk)
答:先执行基类的(如果基类当中有虚基类,要先执行虚基类的,其他基类则按照声明派生类时的顺序依次执行),再执行成员对象的,最后执行自己的。
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’)
3.9.2那为什么有了new/delete,还要malloc/free呢?
3.10 #define DOUBLE(x) x+x (Autodesk)
i = 5*DOUBLE(10);i是多少?正确的声明是什么?
答案:i为60。正确的声明是#define DOUBLE(x) (x+x)
3.11有哪几种情况只能用intialization list而不能用assignment? (Autodesk)
掌握的页面替换算法nru最近不用fifo第二次机会页面替换算法lru最近最少使用算法315有四个同样的容器里面装满了粒数相同的药丸正常药丸的质量为m变质药丸的质量为m1现在已知这四个容器中有一个装的全是变质药丸用电子秤只称一次找出哪个容器装的是变质药丸microsoft答案
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字节。
c语言中sizeof的含义
c语言中sizeof的含义
在C语言中,sizeof是一个用于计算数据类型或变量占用字节大小的运算符。
它可以被用于计算任何数据类型、变量或表达式的大小。
sizeof运算符返回的结果
是一个无符号整数,表示指定对象所占用的字节数。
使用sizeof运算符可以帮助程序员在编写代码时更好地控制和管理内存。
在计
算数据类型的大小时,它会考虑编译器对类型所做的对齐和填充处理。
这意味着sizeof运算符返回的结果可能会比直观的数据类型大小略大。
sizeof运算符主要有两种用法:
1. sizeof(数据类型)
这种用法可以用来计算指定数据类型所占用的字节数。
例如,sizeof(int)将返
回整数类型(int)在当前平台上所占用的字节数。
这对于确定数据类型的字节大小非
常有用,特别是在编写与底层内存相关的代码时。
2. sizeof(变量或表达式)
这种用法将返回指定变量或表达式的字节数。
例如,如果有一个整数变量x,我们可以使用sizeof(x)来计算变量x所占用的字节数。
同样地,我们也可以使用sizeof(x + 1)来计算表达式(x + 1)的字节数。
需要注意的是,sizeof运算符在编译时计算大小,而不是运行时。
这意味着它
可以用于计算静态分配的数组大小,但无法用于动态分配的内存块的大小。
总结起来,C语言中的sizeof运算符用于计算数据类型、变量或表达式所占用
的字节数。
它是一个在编译时计算大小的运算符,可以帮助程序员更好地管理内存。
在编写底层或与内存相关的代码时,了解和正确使用sizeof运算符非常重要。
c语言sizeof()计算空间大小为8
c语言sizeof()计算空间大小为8以C语言sizeof()计算空间大小为8为标题C语言中的sizeof()函数是一种用于计算数据类型或变量所占内存空间大小的运算符。
在C语言中,每个数据类型都有其特定的大小,sizeof()函数可以返回该数据类型或变量所占的字节数。
在C语言中,sizeof()函数的使用非常简单。
它的语法形式为sizeof(数据类型或变量)。
通过将需要计算大小的数据类型或变量作为参数传递给sizeof()函数,就可以得到该数据类型或变量所占的字节数。
sizeof()函数的返回值是一个无符号整数,表示数据类型或变量所占的字节数。
这个返回值的类型是size_t,它是一个定义在stddef.h头文件中的类型。
在C语言中,不同的数据类型所占的字节数是不同的。
下面是一些常见的数据类型及其所占的字节数:- char类型占用1个字节;- short类型占用2个字节;- int类型占用4个字节;- long类型占用4个字节;- float类型占用4个字节;- double类型占用8个字节;- long long类型占用8个字节。
需要注意的是,sizeof()函数返回的是数据类型或变量所占的字节数,并不是实际使用的内存大小。
在实际编程中,还需要考虑对齐问题。
对齐是为了提高内存的访问效率,使得数据在内存中的存储更加紧凑。
在C语言中,对齐是由编译器来处理的。
编译器会根据特定的规则,对数据进行对齐。
这些规则可以通过编译器的选项进行配置,以满足不同的需求。
对于结构体和联合体来说,其大小是由其成员的大小和对齐方式共同决定的。
在计算结构体或联合体的大小时,需要考虑成员的大小和对齐方式,并将其按照对齐方式进行对齐。
除了可以计算数据类型的大小外,sizeof()函数还可以用来计算数组的大小。
对于数组来说,sizeof()函数返回的是整个数组所占的字节数。
下面是一个使用sizeof()函数计算空间大小的示例:```c#include <stdio.h>int main() {int a = 10;printf("int类型所占的字节数:%zu\n", sizeof(int));printf("变量a所占的字节数:%zu\n", sizeof(a));int arr[] = {1, 2, 3, 4, 5};printf("数组arr所占的字节数:%zu\n", sizeof(arr));return 0;}```在上面的示例中,我们使用sizeof()函数计算了int类型、变量a 和数组arr所占的字节数,并通过printf()函数将结果输出到屏幕上。
sizeof的用法
全面解析sizeof的用法以下代码使用平台是Windows7 64bits+VS2012。
sizeof是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数,使用频繁,有必须对齐有个全面的了解。
1.Sizeof的基本语法sizeof有三种语法形式,如下:(1)sizeof( object ); // sizeof( 对象);(2)sizeof( type_name ); // sizeof( 类型);(3)sizeof object; // sizeof 对象;第三种语法结构虽然正确,为简单统一,均使用一、二中写法。
例如:int i;sizeof( i ); // oksizeof i; // oksizeof( int ); // oksizeof int; // error2.sizeof计算基本类型与表示式sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。
这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,sizeof是编译时进行运算,与运行时无关,不会对表达式进行计算。
考察如下代码:#include<iostream>using namespace std;int main(int argc,char* argv[]){cout<<"sizeof(char)="<<sizeof(char)<<endl;cout<<"sizeof(short)="<<sizeof(short int)<<endl;cout<<"sizeof(int)="<<sizeof(int)<<endl;cout<<"sizeof(long)="<<sizeof(long int)<<endl;cout<<"sizeof(long long)="<<sizeof(long int int)<<endl;cout<<"sizeof(float)="<<sizeof(float)<<endl;cout<<"sizeof(double)="<<sizeof(double)<<endl;int i=8;cout<<"i="<<i<<endl;cout<<"sizeof(i)="<<sizeof(i)<<endl;cout<<"sizeof(i)="<<sizeof(i=5)<<endl;cout<<"i="<<i<<endl;}在64bits的Windows下运行结果是sizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=4sizeof(long long)=4sizeof(float)=4sizeof(double)=8i=8sizeof(i)=4sizeof(i)=4i=8注意两点,第一:i的值并未发生改变,表明sizeof括号内的表达式并没有执行,sizeof在编译时求其表达式的运算结果的类型,sizeof运算与运行时无关。
sizeof在计算结构体大小的时候具体是怎样计算的
sizeof在计算结构体大小的时候具体是怎样计算的下面看一下sizeof在计算结构体大小的时候具体是怎样计算的1.test1 空结构体typedef struct node{}S;则sizeof(S)=1;或sizeof(S)=0;在C++中占1字节,而在C中占0字节。
2.test2typedef struct node1{int a;char b;short c;}S1;则sizeof(S1)=8。
这是因为结构体node1中最长的数据类型是int,占4个字节,因此以4字节对齐,则该结构体在内存中存放方式为|--------int--------| 4字节|char|----|--short-| 4字节总共占8字节3.test3typedef struct node2{char a;int b;short c;}S2;则siezof(S3)=12.最长数据类型为int,占4个字节。
因此以4字节对齐,其在内存空间存放方式如下:|char|----|----|----| 4字节|--------int--------| 4字节|--short--|----|----| 4字节总共占12个字节4.test4 含有静态数据成员typedef struct node3{int a;short b;static int c;}S3;则sizeof(S3)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。
其在内存中存储方式如下:|--------int--------| 4字节|--short-|----|----| 4字节而变量c是单独存放在静态数据区的,因此用siezof计算其大小时没有将c所占的空间计算进来。
5.test5 结构体中含有结构体typedef struct node4{bool a;S1 s1;short b;}S4;则sizeof(S4)=16。
sizeof用法示例
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(虚表指针)。
C语言中sizeof函数用法详解!
C语⾔中sizeof函数⽤法详解!sizeof是C语⾔的⼀种单⽬操作符,如C语⾔的其他操作符++、--等。
它并不是函数。
sizeof操作符以字节形式给出了其操作数的存储⼤⼩。
操作数可以是⼀个表达式或括在括号内的类型名。
操作数的存储⼤⼩由操作数的类型决定。
⼆、sizeof的使⽤⽅法 1、⽤于数据类型 sizeof使⽤形式:sizeof(type) 数据类型必须⽤括号括住。
如sizeof(int)。
2、⽤于变量 sizeof使⽤形式:sizeof(var_name)或sizeof var_name 变量名可以不⽤括号括住。
如sizeof (var_name),sizeof var_name等都是正确形式。
带括号的⽤法更普遍,⼤多数程序员采⽤这种形式。
注意:sizeof操作符不能⽤于函数类型,不完全类型或位字段。
不完全类型指具有未知存储⼤⼩的数据类型,如未知存储⼤⼩的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。
三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头⽂件中typedef为unsigned int类型。
该类型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
1、若操作数具有类型char、unsigned char或signed char,其结果等于1。
ANSI C正式规定字符类型为1字节。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double类型的sizeof 在ANSI C中没有具体规定,⼤⼩依赖于实现,⼀般可能分别为2、2、2、2、 4、4、4、8、10。
sizeof结构体长度计算
sizeof结构体长度计算在C语言中,结构体是一种用户自定义的数据类型,它可以包含不同类型的数据成员,这些数据成员可以是基本类型、数组、指针、甚至是其他结构体类型。
在实际编程中,我们经常需要计算结构体的长度,以便在内存中分配空间或者进行数据传输等操作。
本文将介绍C语言中计算结构体长度的方法。
一、结构体的定义在C语言中,定义结构体的语法格式如下:struct 结构体名{数据类型成员名1;数据类型成员名2;...数据类型成员名n;};其中,结构体名是用户自定义的标识符,可以用来声明变量或者作为类型名。
成员名是结构体中的数据成员,可以是任意合法的C数据类型。
结构体中的各个成员按照定义的顺序依次存放在内存中,成员之间没有任何间隔,也没有对齐。
例如,下面是一个简单的结构体定义:struct Student{int id;char name[20];float score;};这个结构体包含三个数据成员,分别是一个整型变量id,一个字符数组name,一个浮点型变量score。
在内存中,这三个成员依次存放在一起,没有任何间隔。
二、sizeof运算符在C语言中,sizeof是一个用于计算数据类型大小的运算符,可以计算任何数据类型的大小,包括基本类型、数组、指针、结构体等。
sizeof运算符的语法格式如下:sizeof(数据类型)其中,数据类型可以是任何C语言中的数据类型,包括基本类型、数组、指针、结构体等。
sizeof运算符返回的是数据类型在内存中所占用的字节数。
例如,下面是一些示例:sizeof(int) //返回4sizeof(char) //返回1sizeof(float) //返回4sizeof(double) //返回8sizeof(int*) //返回8(在64位操作系统上)sizeof(char*) //返回8(在64位操作系统上)sizeof(float*) //返回8(在64位操作系统上)sizeof(double*) //返回8(在64位操作系统上)sizeof(int[10]) //返回40sizeof(char[20]) //返回20sizeof(float[5]) //返回20sizeof(double[3]) //返回24sizeof(Student) //返回24(假设int占4个字节,char占1个字节,float占4个字节)三、计算结构体长度在C语言中,可以使用sizeof运算符来计算结构体的长度,方法是将结构体类型作为参数传递给sizeof运算符,如下所示:sizeof(结构体类型)这样就可以计算出结构体在内存中所占用的字节数。
sizeof在c语言中的用法
sizeof在c语言中的用法一级标题:C语言中的sizeof用法介绍:在C语言中,sizeof是一种用于确定数据类型大小的运算符。
它可以用来获取变量、数据类型或表达式所占用的内存空间大小。
本文将详细介绍C语言中sizeof 的用法,并阐述其在不同情况下的应用。
二级标题一:sizeof基本用法在C语言中,sizeof运算符通常与变量、数据类型和表达式一起使用。
其基本语法如下:sizeof(operand)其中,operand可以是以下几种形式之一:1. 单个变量2. 数据类型3. 表达式当operand为单个变量时,sizeof将返回该变量所占用的字节数。
例如,对于整型变量x,可以使用以下代码查看其所占空间大小:```int x;int size = sizeof(x);```此时,size将被赋值为x所占内存空间的字节数。
当operand为数据类型时,sizeof将返回该数据类型所占用的字节数。
例如,我们可以通过以下方式获得字符型所占内存空间大小:```int size = sizeof(char);```此时,size将被赋值为字符型数据类型所占字节数。
如果operand为表达式,则表达式会先被求解,然后根据求解结果返回相应字节数。
例如,在如下代码片段中:```int x = 5;int size = sizeof(x + 3);```表达式x + 3将先求解为8,然后sizeof运算符返回这个结果所占字节数。
二级标题二:特殊情况下的sizeof用法除了上述基本用法外,sizeof在某些特殊情况下还有其他用途。
1. 数组名作为操作数当数组名作为sizeof的操作数时,sizeof将返回整个数组所占空间大小,而不是指向数组的指针类型所占字节数。
例如:```int arr[5];int size = sizeof(arr); // 返回整个数组arr的大小```此时,size将被赋值为整个数组arr所占空间的字节数。
sizeof函数
VC中的sizeof的用法总结(全)1. 定义:sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。
返回值类型为size_t,在头文件stddef.h中定义。
这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char、signed char和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型。
MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes,associated with avariable or a type (including aggregate types). This keyword returns a value of type size_t.2. 语法:sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象);2) sizeof( type_name ); // sizeof( 类型);3) sizeof object; // sizeof 对象;所以,sizeof int; // errorsizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。
如:sizeof( 2 );// 2的类型为int,所以等价于sizeof( int );sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于sizeof(double );sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,我们来看一个完整的例子:char foo(){printf("foo() has been called.\n");return 'a';}int main(){size_t sz = sizeof( foo() ); // foo() 的返回值类型为char,所以sz = sizeof( char ),foo()并不会被调用printf("sizeof( foo() ) = %d\n", sz);}C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:sizeof( foo );// errorvoid foo2() { }sizeof( foo2() );// errorstruct S{unsigned int f1 : 1;unsigned int f2 : 5;unsigned int f3 : 12;};sizeof( S.f1 );// error3. sizeof的常量性sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如:char ary[ sizeof( int ) * 10]; // ok最新的C99标准规定sizeof也可以在运行时刻进行计算,如下面的程序在Dev-C++中可以正确执行:int n;n = 10; // n动态赋值char ary[n]; // C99也支持数组的动态定义printf("%d\n", sizeof(ary)); // ok. 输出10但在没有完全实现C99标准的编译器中就行不通了,上面的代码在VC6中就通不过编译。
C#能否获取一个对象所占内存的大小?
C#能否获取⼀个对象所占内存的⼤⼩?今⽇,在项⽬重构的时候忽然想到⼀个问题,⼀个类哪些成员的增加,会影响⼀个类所占内存的⼤⼩?C#有没有办法知道⼀个对象占多少内存呢?第⼀个问题:很快想到是类的⾮静态的字段、属性。
第⼆个问题:⾸先想到的是sizeof()。
下⾯开始验证,⾸先来验证值类型,验证代码如下:int size = sizeof (int); //4个字节注意点:sizeof 运算符仅适⽤于值类型,⽽不适⽤于引⽤类型。
sizeof 运算符只能在不安全代码块中使⽤。
如下⾯的代码将⽆法编译通过:public struct TestStuct{}int size = sizeof(new TestStuct());编译后,提⽰:错误 1 “ConsoleApplication3.TestStuct”没有预定义的⼤⼩,因此 sizeof 只能在不安全的上下⽂中使⽤(请考虑使⽤System.Runtime.InteropServices.Marshal.SizeOf)修改为Marshal.SizeOf⽅法,改⽅法返回对象的⾮托管⼤⼩(以字节为单位)。
参数可以是引⽤类型或装箱的值类型。
布局必须是连续的或显式的。
int size = Marshal.SizeOf(new TestStuct()); //1个字节接下来来验证引⽤类型:由于不能作为⾮托管结构进⾏封送处理;⽆法计算有意义的⼤⼩或偏移量。
所有下⾯的代码在运⾏的时候,会抛出异常。
public class Student{}int size = Marshal.SizeOf(new Student());需要给Student类,加上⼀个StructLayoutAttribute,来控制Student类的数据字段的物理布局。
修改代码为:[StructLayout(LayoutKind.Sequential)]public class Student{}int size = Marshal.SizeOf(new Student()); //1个字节LayoutKind 默认值为Auto.结论:1:对于托管对象是没有办法直接获取到⼀个对象所占的内存⼤⼩。
sizeof(class)---类的字节长度
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{public:void fun1(){};virtual void fun2(){};};class D{public:void fun1(){};virtual void fun2(){};virtual void fun3(){};public:int a;};int main(){A a;A* a1=new A();cout<<"A's size is "<<sizeof(A)<<"."<<endl;cout<<"B's size is "<<sizeof(B)<<"."<<endl;cout<<"C's size is "<<sizeof(C)<<"."<<endl;cout<<"D's size is "<<sizeof(D)<<"."<<endl;cout<<"A's object size is "<<sizeof(a)<<"."<<endl;cout<<"A's object pointer size is "<<sizeof(a1)<<"."<<endl;system("pause");return 0;}注:VS2010 Win7 32位总结:(1)仅仅含有函数成员的类的⼤⼩是1(不知为啥,希望⼤神解释)(2)含有数据成员的类的⼤⼩为数据成员字节对齐后所占空间⼤⼩(3)含有虚函数类,虚函数所占的空间为四字节(⼀个指向虚函数表的指针,与虚函数的个数⽆关)(4)对象与类所占的空间同样(5)类对象指针的⼤⼩为4。
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语言中用于获取变量或数据类型所占用的内存空间大小的一个非常实用的运算符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sizeof计算含有虚函数的类的空间大小
当我们计算一种数据类型所占用的空间大小时,很easy,sizeof就可以解决掉。
如果我们计算一个类,一个空类,或者一个含有虚函数然后又派生子类时,这时候他们所占用的内存空间是如何变化的呢?下面我们就通过代码来介绍下。
一个不含有虚函数的普通类与其派生类的内存关系
class Base
{
public:
Base(int x):a(x)
{}
void print()
{
cout<<a<<endl;
}
private:
int a;
};
class Derived:public Base
{
public:
Derived(int x):Base(x-1),b(x){}
void print(){};
private:
int b;
};
此时Base类和Derived类的内存空间是怎样的呢?
Sizeof(Base) 和sizeof(Derived)
1.对于Base类
Base类中含有一个整型成员变量,sizeof(int) = 4,print()函数不占用内存。
所以Base类占用的内存空间大小为4字节
2.对于Derived类
Derived类继承于Base类,自然的继承了其成员变量a,自身又扩展了自己的成员变量b,因而多了4个字节。
所以Derived类所占用的内存空间大小应该为8字节。
一个含有虚函数的类与其派生类的内存空间占用关系
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-1),b(x){}
virtual void print(){cout<<b<<endl;}
private:
int b;
};
此时Base类和Derived类的内存空间是怎样的呢?
Sizeof(A )和sizeof(B)
1.对于类A
类A中不仅有一个成员变量还有一个虚函数,因为虚函数需要一个指针去维护这个类的虚函数表,普通函数是不占用内存的。
在32位系统中,一个指针的字节大小是4字节,但是在64位Ubuntu系统中一个指针的大小是8个字节。
此段代码是在64位系统下测试的。
所以类A所占用的内存大小为4+8 =12?这看起来是很容易的数学题,但是这真的对吗?答案很清晰,这明显是错的!为什么呢?因为这里面有对齐和补齐的因素。
12不能满足是8的倍数。
所以需要补齐4字节。
因此此类的内存空间大小是16字节。
如果是32位系统则sizeof(A)=8,64位系统是sizeof(A)=16
2.对于类B
类B中继承了A的成员变量,自身也扩展了成员变量b,因为有个虚函数,所以需要虚函数表额指针去维护。
4+4+8 = 16字节。
(64系统)
32位系统sizeof(B)=4+4+4 =12
64位系统sizeof(B)=4+4+8=16
●空类的内存空间
Class A
{
};
Sizeof(A)=1
由于Ashi空类,编译器会安插一个char空类,标记它的每一个对象,因此其大小为1字节。
●更多请前往个人文库
/p/helpylee。