详细解析sizeof()
- 格式:docx
- 大小:19.07 KB
- 文档页数:7
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/C++语言中非常常用的一个操作符,用于计算数据类型或变量在内存中所占的字节数。
本文将从使用方法、注意事项、应用场景等方面进行详细讲解。
1.使用方法sizeof操作符有两种用法:(1)计算数据类型在内存中所占的字节数语法:sizeof(数据类型)例子:sizeof(int)(2)计算变量在内存中所占的字节数语法:sizeof(变量名)例子:int a; sizeof(a)2.注意事项(1)sizeof操作符计算的字节数只与数据类型相关,与具体的实现相关性较小。
(2)对于数组,sizeof计算的是整个数组所占的字节数,而不是指向数组首元素的指针所占的字节数。
(3)对于指针,sizeof计算的是指针本身所占的字节数,而不是指针指向对象所占的字节数。
(4)通过结构体、共用体等数据类型可以自定义复合类型,sizeof计算的是整个数据类型所占的字节数。
(5)sizeof操作符是在编译时计算,不会对程序运行造成任何影响。
3.应用场景(1)动态内存分配在进行动态内存分配时,需要根据数据类型的大小决定分配的内存空间大小。
使用sizeof操作符可以方便地获取数据类型的大小,从而确定需要分配的内存大小。
(2)指针运算对指针进行加减运算时需要知道指针指向对象的大小,从而确定加减的偏移量。
使用sizeof操作符可以获取指针指向对象的大小。
(3)复合类型处理在处理复合类型数据时,需要知道整个数据类型所占的字节数,从而方便进行内存分配、指针运算等操作。
使用sizeof操作符可以获取复合类型数据的大小。
(4)调试和分析在进行程序调试和性能分析时,需要了解数据类型在内存中的存储情况,使用sizeof操作符可以获取数据类型在内存中所占的字节数,进而方便进行调试和分析。
总之,sizeof操作符是C/C++语言中非常重要的操作符,在程序开发、调试和分析中都具有重要作用。
需要注意的是,在使用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语言的sizeof函数sizeof函数是C语言中常用的一个操作符,用于返回一些变量或类型的大小,单位为字节。
它是一个编译时运算符,返回值是一个常量表达式,不需要运行时计算。
sizeof操作符可以用于任何数据类型,并且也可以用于结构体、联合体、数组等复杂类型。
本文将详细介绍sizeof函数的功能、用法和实例,以帮助读者更好地理解和使用它。
1. sizeof函数的功能sizeof函数的主要功能是返回操作数的大小,即占用的字节数。
它可以用于以下方面:a) 检查变量的大小:可以用sizeof函数来检查不同类型的变量所占用的内存大小。
例如,可以使用sizeof(int)来获取int类型变量的大小。
b) 计算数组的大小:可以使用sizeof函数来计算数组的大小。
例如,可以使用sizeof(array)来获取array数组的大小。
c) 计算结构体、联合体的大小:可以使用sizeof函数来计算结构体或联合体所占用的内存大小。
例如,可以使用sizeof(struct MyStruct)来获取MyStruct结构体的大小。
d) 动态内存分配:可以使用sizeof函数来确定在动态内存分配中所需的内存大小。
例如,可以使用sizeof(int) * n来为n个整数分配内存。
2. sizeof函数的用法sizeof函数的基本用法为sizeof(操作数)。
其中,操作数可以是以下类型:a) 数据类型:可以直接使用sizeof(数据类型)来获取该类型变量的大小。
例如,sizeof(int)。
b) 变量名:可以使用sizeof(变量名)来获取该变量所占用的内存大小。
例如,sizeof(num)。
c) 表达式:可以使用sizeof(表达式)来获取表达式的结果所占用的内存大小。
例如,sizeof(a + b)。
d) 指针:可以使用sizeof(指针变量)来获取指针变量所占用的内存大小,而不是它指向的对象的大小。
例如,sizeof(ptr)。
sizeof函数sizeof函数是C/C++程序设计语言中一种特殊的运算符,它的作用是计算出某个变量的字节大小,或者计算出某个类型的变量的大小。
SIZE OF函数只能用于计算表达式,不能用于赋值语句。
它主要包括两种类型,即“表达式SIZE OF”和“变量SIZE OF”。
常见的引起SIZE OF函数的原因有以下几个:第一,获取某个变量的字节大小:在C/C++程序设计中,如果要获取某个变量的字节大小,可以通过SIZE OF函数来实现,如:SIZE OF(parameter);第二,在语句中测试某个变量的大小:比如在语句中测试一个字符串的长度,可以直接用SIZE OF函数来实现,如:SIZE OF(string);又如使用预处理器宏#ifndef来测试一个变量的大小,可以使用SIZE OF函数,如:#ifndef(SIZE OF(variable) > 10);第三,在结构体(struct)定义中计算结构体占用的字节大小:在定义结构体时,可以使用SIZE OF函数来实现,如:SIZE OF(struct );第四,在数组定义中计算元素占用的字节大小:在定义数组时,可以使用SIZE OF函数来实现,如:SIZE OF(array[index]);第五,在函数定义或实现中计算参数的字节大小:在函数定义和实现时,可以使用SIZE OF函数来实现,如:SIZE OF(param);SIZE OF函数的使用也不是毫无前提的,它的使用也受到一些限制的,比如它的使用不可以与指针操作运算符一起使用,也不可以与其他操作符(如移位运算符、算术运算符)一起使用,并且不可以对它进行解引用,而且它也不能用于计算函数的字节大小,除非使用函数指针。
SIZE OF函数是一个十分重要的函数,在C/C++程序设计中它拥有十分广泛的用途。
它可以用于计算各种变量和表达式的字节大小,也可以用于测试各种变量和表达式的大小,还可以用于表达式计算,比如:SIZE OF(expression);或者可以用于结构体定义和数组定义,比如:SIZE OF(struct);SIZE OF(array[index]);等等。
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 这个家伙的使用方法。
你说 sizeof 像不像一把神奇的尺子呀?它能帮我们准确地量出各种数据类型所占的空间大小呢!比如说,你想知道一个整数在内存中占了多大地方,sizeof 就能告诉你答案。
就好比你去买衣服,你得知道自己的尺码吧?不然怎么能买到合身的呢?sizeof 就像是那个帮你量尺寸的店员,能让你清楚知道每个数据类型的“身材”。
那怎么用这把“尺子”呢?很简单啦!就把你想要量的东西放在sizeof 后面就行。
比如说 sizeof(int),它就会告诉你整数类型所占的字节数。
这可太有用啦!为啥呢?你想想啊,有时候我们写程序,得考虑内存的使用情况吧。
如果不清楚每个数据类型占多少空间,那不是容易出乱子嘛。
举个例子哈,你要存储很多数据,如果不知道它们各自占多大空间,可能就会导致内存不够用,程序就崩溃啦!这就好像你要装很多东西到一个箱子里,你总得知道每个东西大概占多大地方,才能合理安排空间,对吧?而且 sizeof 可不光能量基本数据类型哦,它对结构体、数组这些也都管用呢!就像它能量出一个人的身高、体重,也能量出一群人的总体情况一样。
比如说,你有个结构体,里面包含了各种不同类型的数据。
那sizeof 就能告诉你整个结构体所占的空间大小。
这就好比你要知道一个团队的整体规模, sizeof 就能帮你做到。
还有数组呢,它能准确地告诉你这个数组所占的总字节数。
这就像你知道一箱子苹果有多少个,每个苹果多大,就能算出这箱苹果占了多大空间一样。
总之啊,sizeof 就像是我们编程世界里的一个小助手,默默地帮我们把各种数据的“身材”量得清清楚楚。
有了它,我们就能更好地管理内存,让程序跑得更顺畅。
所以啊,朋友们,可别小看了 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 运算符计算的是指针本身的字节大小,而不是指针所指向的数据类型的字节大小。
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函数使用SIZEOF函数是一种在编程语言中常见的操作符,用于计算给定数据类型或对象的大小。
在不同的编程语言中,SIZEOF函数的具体用法和功能可能有所不同,但其基本目的都是为了测量特定类型或对象在内存中所占用的字节数。
在C语言中,SIZEOF函数是一个运算符而不是一个函数,用于计算给定类型的对象或表达式所占用的字节数。
这可以用来确定数据类型在内存中所占的空间,从而有效地进行内存管理。
例如,在声明数组时,可以使用SIZEOF函数计算数组的大小而不需要手动输入具体的字节数。
以下是一个示例:```c#include <stdio.h>int maiint arr[5];size_t size = sizeof(arr);printf("The size of the array is: %zu\n", size);return 0;```在上面的例子中,sizeof(arr)会返回整数数组arr所占用的字节数,然后将其打印到控制台。
在C++语言中,SIZEOF函数功能与C语言相同,但使用方式略有不同。
下面是一个使用SIZEOF函数的C++示例:```cpp#include <iostream>using namespace std;int maiint arr[5];size_t size = sizeof(arr);cout << "The size of the array is: " << size << endl;return 0;```在上面的示例中,SIZEOF函数用于计算整数数组arr的字节数,并将结果打印到控制台。
在其他编程语言中,如Java和Python,可能没有明确的SIZEOF函数,但可以使用其他方法来获取对象或类型的大小。
例如,在Java中,可以使用ng.instrument包中的Instrumentation类来测量对象的大小。
一、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为unsignedint类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
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。
3、当操作数是指针时,sizeof依赖于编译器。
例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。
一般Unix的指针字节数为4。
4、当操作数具有数组类型时,其结果是数组的总字节数。
5、联合类型操作数的sizeof是其最大字节成员的字节数。
结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
让我们看如下结构:struct {char b; double x;} a;在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
如double类型的结构成员x要放在被4整除的地址。
6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
四、sizeof与其他操作符的关系sizeof的优先级为2级,比/、%等3级运算符优先级高。
它可以与其他操作符一起组成表达式。
如i*sizeof(int);其中i为int类型变量。
五、sizeof的主要用途1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。
例如:void *malloc(size_t size),size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2、sizeof的另一个的主要用途是计算数组中元素的个数。
例如:void * memset(void * s,int c,sizeof(s))。
六、建议由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。
1、 sizeof应用在结构上的情况请看下面的结构:struct MyStruct{double dda1;char dda;int type};对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。
你知道为什么在VC中会得出这样一个结果吗?其实,这是VC对变量存储的一个特殊处理。
为了提高CPU的存储速度,VC 对一些变量的起始地址做了“对齐”处理。
在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
下面列出常用类型的对齐方式(vc6.0,32位系统)。
类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)Char偏移量必须为sizeof(char)即1的倍数int偏移量必须为sizeof(int)即4的倍数float偏移量必须为sizeof(float)即4的倍数double偏移量必须为sizeof(double)即8的倍数Short偏移量必须为sizeof(short)即2的倍数各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。
同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
下面用前面的例子来说明VC到底怎么样来存放结构的。
struct MyStruct{double dda1;char dda;int type};为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。
所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。
下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:struct MyStruct{char dda;double dda1;int type};这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)为24。
结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。
(简单说明)struct MyStruct{char dda;//偏移量为0,满足对齐方式,dda占用1个字节;double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8//的倍数,需要补足7个字节才能使偏移量变为8(满足对齐//方式),因此VC自动填充7个字节,dda1存放在偏移量为8//的地址上,它占用8个字节。
int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍//数,满足int的对齐方式,所以不需要VC自动填充,type存//放在偏移量为16的地址上,它占用4个字节。
};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构//的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof//(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为//sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。
其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。
VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。
VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。
n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
下面举例说明其用法。
#pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐struct test{char m1;double m4;int m3;};#pragma pack(pop)//恢复对齐状态以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。
接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。
接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。
这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。
如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。
(请读者自己分析)2、 sizeof用法总结在VC中,sizeof有着许多的用法,而且很容易引起一些错误。