sizeof进行结构体大小的判断
c++中关于结构体长度的计算问题
[C++]字节对齐与结构体大小[C++] 2010-09-24 21:40:26 阅读172 评论0 字号:大中小订阅说明:结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。
这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于误导他人。
一、解释现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
各个硬件平台对存储空间的处理上有很大的不同。
一些平台对某些特定类型的数据只能从某些特定地址开始存取。
比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。
二、准则其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
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.与strlen()比较strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
2.指针与静态数组的sizeof操作指针均可看为变量类型的一种。
所有指针变量的sizeof 操作结果均为4。
注意:int *p; sizeof(p)=4;但sizeof(*p)相当于sizeof(int);对于静态数组,sizeof可直接计算数组大小;例:int a[10];char b[]="hello";sizeof(a)等于4*10=40;sizeof(b)等于6;注意:数组做型参时,数组名称当作指针使用!!void fun(char p[]){sizeof(p)等于4}经典问题:double* (*a)[3][6];cout<<sizeof(a)<<endl; // 4 a为指针cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组 cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。
既然是指针,所以sizeof(a)就是4。
既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。
c语言中sizeof的用法举例
c语言中sizeof的用法举例在C语言中,sizeof是一个用于计算数据类型或变量所占字节数的运算符。
它可以用于计算各种数据类型的大小,包括基本数据类型、数组、结构体和联合体等。
下面是一些使用sizeof运算符的示例:1. 计算基本数据类型的大小:c#include <stdio.h>int main() {printf("int类型的大小为:%zu 字节\n", sizeof(int));printf("float类型的大小为:%zu 字节\n", sizeof(float));printf("char类型的大小为:%zu 字节\n", sizeof(char));printf("double类型的大小为:%zu 字节\n", sizeof(double));return 0;}输出:int类型的大小为:4 字节float类型的大小为:4 字节char类型的大小为:1 字节double类型的大小为:8 字节2. 计算数组的大小:c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);printf("数组的大小为:%d\n", size);return 0;}输出:数组的大小为:53. 计算结构体的大小:c#include <stdio.h>struct Student {char name[20];int age;float score;};int main() {struct Student stu;printf("结构体的大小为:%zu 字节\n", sizeof(stu));return 0;}输出:结构体的大小为:28 字节4. 计算联合体的大小:c#include <stdio.h>union Data {int num;float f;char str[20];};int main() {union Data data;printf("联合体的大小为:%zu 字节\n", sizeof(data));return 0;}输出:联合体的大小为:20 字节5. 计算指针类型的大小:c#include <stdio.h>int main() {int *ptr;printf("指针的大小为:%zu 字节\n", sizeof(ptr));return 0;}输出:指针的大小为:8 字节(在64位系统上)6. 计算自定义类型的大小:c#include <stdio.h>typedef struct {int x;int y;} Point;int main() {Point p;printf("自定义类型的大小为:%zu 字节\n", sizeof(p));return 0;}输出:自定义类型的大小为:8 字节总结:sizeof运算符可以用于计算各种数据类型的大小,包括基本数据类型、数组、结构体、联合体和指针等。
sizeof的使用方法
学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既
然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中
,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的6
4位系统中指针变量的sizeof结果为8。
性强些。
4. 基本数据类型的sizeof
这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,
由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注
意,尽量不要在这方面给自己程序的移植造成麻烦。
一般的,在32位编译环境中,sizeof(int)的取值为4。
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
二、sizeof的使用方法
1、用于数据类型
sizeof使用形式:sizeof(type)
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( S.f1 );// error
3. 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运算与运行时无关。
C语言sizeof()用法介绍
C语⾔sizeof()⽤法介绍1. 定义sizeof是⼀个操作符(operator)。
其作⽤是返回⼀个对象或类型所占的内存字节数。
2. 语法sizeof有三种语法形式:1) sizeof (object); //sizeof (对象)2) sizeof object; //sizeof 对象3) sizeof (type_name); //sizeof (类型)对象可以是各种类型的变量,以及表达式(⼀般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,编译⽆误1. 基本数据类型的sizeof这⾥的基本数据类型是指short、int、long、float、double这样的简单内置数据类型。
由于它们的内存⼤⼩是和系统相关的,所以在不同的系统下取值可能不同。
2. 结构体的sizeof结构体的sizeof涉及到字节对齐问题。
为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。
为此,编译器默认会对结构体进⾏处理(实际上其它地⽅的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,依次类推。
这样,两个数中间就可能需要加⼊填充字节,所以整个结构体的sizeof值就增长了。
sizeof的用法以及编程中的常见问题
• 一个问题: void foo3(char a3[3]) { int c3 = sizeof( a3 ); // c3 == } void foo4(char a4[]) { int c4 = sizeof( a4 ); // c4 == } c3,c4值应该是多少呢?
• 问题的解答: • 这里函数参数a3已不再是数组类型,而是 蜕变成指针,相当于char* a3。数组是“传 址”的,调用者只需将实参的地址传递过 去,所以a3自然为指针类型(char*),c3 的值也就为4。
结构体的sizeof
• 字节对齐:有助于加快计算机的取数速度 struct S1 { char c; int i; }; struct S2 { int i; char c; }; sizeof(S1), sizeof(S2)?
• 字节对齐的细节和编译器实现相关,但一 般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本 类型成员的大小所整除; 2) 结构体每个成员相对于结构体首地址的 偏移量(offset)都是成员大小的整数倍, 如有需要编译器会在成员之间加上填充字 节(internal adding); 3) 结构体的总大小为结构体最宽基本类型 成员大小的整数倍,如有需要编译器会在 最末一个成员之后加上填充字节(trailing padding)。
• 整数的取值范围 char a[300]={0}; U8 i=0; … for (;i<300;i++) { ... }
• 无符号数 int array[]={23,24,12,17,204,99,16}; #define TATOL_ELEMENTS (sizeof(array)/sizeof(array[0])) main() { int d=-1,x; … if(d<= TATOL_ELEMENTS-2) x=array[d+1]; … }
sizeof的返回类型
sizeof的返回类型摘要:一、sizeof 的定义与作用二、sizeof 的返回类型1.整型数据类型2.浮点型数据类型3.字符型数据类型4.指针类型5.数组类型6.结构体类型7.联合体类型三、sizeof 与类型转换四、sizeof 与对象的大小五、sizeof 的局限性正文:sizeof 是一个在编程中常用的运算符,用于计算数据类型或对象的大小。
它的返回类型是一个整型数值,表示该数据类型或对象在内存中所占的字节数。
sizeof 运算符主要应用于C/C++等编程语言中。
sizeof 的返回类型取决于所计算的数据类型。
对于整型数据类型,如int、short、long 等,sizeof 返回的是该数据类型所占用的字节数。
对于浮点型数据类型,如float、double 等,sizeof 返回的是该数据类型所占用的字节数。
对于字符型数据类型,如char,sizeof 返回的是该数据类型所占用的字节数。
此外,sizeof 还可以用于计算指针类型、数组类型、结构体类型和联合体类型的大小。
指针类型的大小取决于所指向的数据类型,数组类型的大小取决于数组中元素的数量和元素类型的大小,结构体类型的大小取决于结构体中成员变量的大小,联合体类型的大小取决于联合体中成员变量的大小。
需要注意的是,sizeof 运算符不能用于类型转换。
例如,不能通过sizeof(int) 来判断一个变量是否为整型。
此外,sizeof 运算符只能计算对象在内存中的大小,不能反映对象在实际运行中的表现。
例如,一个字符串在内存中可能占用多个字节,但在显示时可能只显示其中的一部分。
总之,sizeof 是一个非常有用的运算符,可以帮助程序员了解数据类型和对象在内存中的大小。
然而,sizeof 也有一定的局限性,不能反映对象在实际运行中的表现和类型转换。
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运算符可以用来计算指定类型或变量的内存大小。
通过将结构体数组的总大小除以单个结构体的大小,可以得到数组元素的个数。
首先,定义一个结构体并创建结构体数组。
struct Student{int ID;char name[20];};int main(){struct Student students[10]; //创建一个包含10个元素的结构体数组int sizeOfStudentArray = sizeof(students) /sizeof(students[0]);printf("结构体数组的元素个数为: %d", sizeOfStudentArray);return 0;}以上代码中,首先定义了一个名为Student的结构体,包含一个整型变量ID和一个字符数组name。
然后,在主函数中,创建了一个包含10个元素的Student类型的结构体数组。
接下来,通过使用sizeof运算符来计算结构体数组的总大小,再除以单个结构体的大小,得到数组元素的个数。
值得注意的是,sizeof运算符返回的是以字节为单位的大小。
因此,需要将结构体数组的总大小除以单个结构体的大小,才能得到数组元素的个数。
方法二:遍历结构体数组另一种常用的方法是通过遍历结构体数组来计算元素的个数。
这种方法比较直观,可以使用循环结构遍历数组中的每个元素,并在循环结束后得到元素个数。
struct Student{int ID;char name[20];};int main(){struct Student students[10]; //创建一个包含10个元素的结构体数组int count = 0;int i;for(i = 0; i < sizeof(students) / sizeof(students[0]); i++){count++;}printf("结构体数组的元素个数为: %d", count);return 0;}以上代码中,首先定义了一个名为Student的结构体,包含一个整型变量ID和一个字符数组name。
sizeof用法
一.基本数据的长度char:1(有符号无符号同)short:2(有符号无符号同)int:4(有符号无符号同)long:4(有符号无符号同)float:4double:8二.对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。
一些平台对某些特定类型的数据只能从某些特定地址开始存取。
比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。
显然在读取效率上下降很多。
三.一些常见的和需要注意的sizeofchar* a= "abc"; //sizeof(a)=4==============================================char b[100]; //sizeof(b)=100;==============================================char* c=(char*)malloc(100); //sizeof(c)=100==============================================char d[] = "abc"; //sizeof(d)=4==============================================int e[100]; //求数组的元素个数int c2 = sizeof( e ) / sizeof( e[0] ); // 总长度/第一个元素的长度==============================================void foo3(char f[3]){int c3 = sizeof( f); // c3 =4}==============================================void foo4(char g[]){int c4 = sizeof( g); // c4 =4}==============================================int a = 1, b =2; 执行sizeof (a = b)之后为什么a=1, 而不是2. 为什么没有执行赋值操作? (淘宝笔试题)(1)sizeof (type-name) 是求变量类型的大小,在编译期执行,因为sizeof 是在编译期内执行而不是在运行期所以 sizeof (a = b) 是不会运行a = b 这个操作的。
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 及结构体联合体大小计算方法2010-09-06 16:30Cpp代码// Example of the sizeof keywordsize_t i = sizeof( int );struct align_depends {char c;int i;};size_t size = sizeof(align_depends); // The value of size depends on// the value set with /Zp or// #pragma packint array[] = { 1, 2, 3, 4, 5 }; // sizeof( array ) is 20// sizeof( array[0] ) is 4size_t sizearr = // Count of items in arraysizeof( array ) / sizeof( array[0] );// Example of the sizeof keywordsize_t i = sizeof( int );struct align_depends {char c;int i;};size_t size = sizeof(align_depends); // The value of size depends on// the value set with /Zp or// #pragma packint array[] = { 1, 2, 3, 4, 5 }; // sizeof( array ) is 20// sizeof( array[0] ) is 4size_t sizearr = // Count of items in arraysizeof( array ) / sizeof( array[0] );<script src="ms-its:dsmsdn.chm::/html/msdn_footer.js"></script>1. 用法1.1 sizeof和new、delete等一样,是关键字,不是函数或者宏。
对C语言中的sizeof的介绍分析
对C语言中的sizeof的介绍分析对C语言中的sizeof的介绍分析引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是店铺分享给大家的对C语言中的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 atype (including aggregate types). This keyword returns a value of typesize_t.2. 语法:sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象 );2) sizeof( type_name ); // sizeof( 类型 );3) sizeof object; // sizeof 对象;所以一下三种sizeof的使用都是对的复制代码代码如下:#includemain(){int b;printf("%dn",sizeof b);printf("%dn",sizeof(b));printf("%dn",sizeof(int));}3. 基本数据类型的sizeof这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。
c 结构体大小计算
c 结构体大小计算摘要:1.结构体的概念2.结构体大小的计算方法3.结构体大小计算的实例正文:1.结构体的概念结构体是一种复合数据类型,它可以包含不同类型的数据元素。
这些数据元素被称为结构体的成员,它们按照一定的顺序排列。
结构体在C 语言中被广泛应用,用于描述复杂的数据结构,如链表、树等。
2.结构体大小的计算方法结构体大小的计算方法是指在C 语言中,如何确定一个结构体所占用的内存空间的大小。
结构体大小的计算通常需要考虑以下几个方面:- 结构体成员的大小:结构体的成员可以是各种基本数据类型,如int、float、double 等,也可以是其他结构体。
在计算结构体大小时,需要考虑成员的大小。
- 结构体成员的排列:结构体的成员在内存中的排列顺序会影响结构体的大小。
通常,结构体的成员会按照定义的顺序依次排列。
- 结构体成员之间的间距:结构体的成员之间需要保留一定的间距,以确保数据的正确性。
这个间距通常称为“对齐要求”。
3.结构体大小计算的实例下面是一个简单的结构体大小计算实例:```c#include <stdio.h>typedef struct {int a;double b;char c;} MyStruct;int main() {MyStruct s;printf("结构体MyStruct 的大小为:%zu", sizeof(s));return 0;}```在这个例子中,我们定义了一个名为MyStruct 的结构体,它包含三个成员:一个整型变量a,一个双精度浮点型变量b,和一个字符型变量c。
在main 函数中,我们使用sizeof 运算符来计算结构体MyStruct 的大小,并将结果输出。
c sizeof的原理
c sizeof的原理
在C语言中,sizeof是一个用于计算数据类型所占用字节数的运算符。
它可以帮助程序员确定数据类型的大小,以便在编写代码时分配适当的内存空间。
sizeof运算符的原理是在编译阶段由编译器完成的。
编译器根据数据类型的定义和目标平台的特性来确定其占用的字节数。
sizeof运算符可以用于任何数据类型,包括基本数据类型(如int、float、char 等)和自定义数据类型(如结构体、联合体等)。
它的语法形式为sizeof(type),其中type可以是任何数据类型的名称。
sizeof运算符的结果是一个无符号整数,表示数据类型所占用的字节数。
这个结果可以用来确定数组的长度、计算结构体的大小以及在动态内存分配时决定所需的内存大小。
需要注意的是,sizeof运算符并不会进行实际的内存读取或计算。
它在编译时进行静态计算,因此不会对程序的性能产生任何影响。
另外,sizeof对于指针类型的操作稍有不同。
对指针类型应用sizeof运算符会返回指针本身的大小,而不是指针所指向的数据类型的大小。
这是因为指针只是一个地址,而不存储实际的数据。
综上所述,sizeof是一个在编译阶段由编译器完成的运算符,用于计算数据类型所占用的字节数。
它在C语言中广泛应用于内存分配和数据处理的优化上,帮助程序员更有效地管理内存和处理数据。
sizeof 引用
sizeof 引用Sizeof引用是计算一个引用变量在内存种所占用的字节数的操作。
引用变量是在C++中非常常见的一种变量类型,它允许开发人员在程序中使用一个已经存在的变量名来代替原变量的地址。
然而,与其他变量类型不同,引用变量的大小在计算时是有所不同的。
以下是关于sizeof引用的一些重要的信息:1. sizeof引用的结果通常是指针的大小因为引用变量的本质是一个指向原始变量的指针,所以sizeof引用的计算结果通常是指针的大小。
换言之,一个引用变量通常只占用一个指针变量的内存空间,而并不会分配分配一个新的内存块。
这是因为引用变量会直接引用已经存在的变量,而并不会为它们分配额外的内存。
2. 在某些情况下,sizeof引用的结果与原变量的大小相同在某些特定情况下,sizeof引用的结果可能与原变量的大小相同。
这通常发生在使用sizeof计算结构体内成员的大小时。
因为引用变量在结构体中本质上是成员变量的别名,所以其大小会与原始成员变量相同。
此外,在某些特定的编译器中,sizeof引用的结果也可能会与原始变量的大小相同。
3. 对于数组类型,sizeof引用的结果与指针相同与指针变量类似,对于数组类型的引用变量,sizeof引用的结果通常是指针的大小。
这是因为虽然数组类型的变量可能会占用多个内存块,但是引用变量本身并不占用多个内存块,而是指向数组内存块的指针。
4. 如果引用变量不是指针,则sizeof引用的结果与原始变量大小相同如果引用变量不是指针类型,例如引用类型为int&,则sizeof引用的结果与原始变量的大小相同。
这是因为在这种情况下,引用变量不是指针,它会在内存中分配一个独立的空间,并且其大小与原始变量相同。
总之,sizeof引用的计算结果取决于引用变量的类型、所引用的变量类型和编译器环境等因素。
因此,在使用sizeof计算引用变量大小时,需要注意这些因素并且根据实际情况进行计算。
在大多数情况下,sizeof引用的结果通常是指针的大小。
c语言 结构体大小
c语言结构体大小C语言中的结构体是一种非常重要的数据类型,它可以将不同类型的数据组合在一起,形成一个新的数据类型。
在C语言中,结构体的大小是一个非常重要的概念,它决定了结构体在内存中所占用的空间大小。
本文将从结构体大小的概念、计算方法以及影响因素等方面进行详细介绍。
一、结构体大小的概念结构体大小指的是结构体在内存中所占用的空间大小,它是由结构体中所有成员变量的大小之和决定的。
在C语言中,结构体的大小必须是成员变量大小的整数倍,否则会出现内存对齐的问题。
二、结构体大小的计算方法结构体大小的计算方法可以通过以下公式进行计算:struct MyStruct {int a;char b;double c;};sizeof(MyStruct) = sizeof(int) + sizeof(char) + sizeof(double)其中,sizeof是C语言中的一个运算符,用于计算数据类型或变量在内存中所占用的字节数。
在上面的例子中,MyStruct结构体中包含了一个int类型的成员变量a、一个char类型的成员变量b和一个double类型的成员变量c,因此结构体的大小等于这三个成员变量的大小之和。
三、影响结构体大小的因素1. 数据类型的大小不同的数据类型在内存中所占用的空间大小是不同的,例如int类型的大小为4个字节,而char类型的大小为1个字节。
因此,结构体中包含的不同数据类型的大小会影响结构体的大小。
2. 内存对齐内存对齐是指将数据存储在内存中时,按照一定的规则将数据对齐到特定的地址上。
在C语言中,结构体的大小必须是成员变量大小的整数倍,否则会出现内存对齐的问题。
例如,如果一个结构体中包含了一个int类型的成员变量和一个char类型的成员变量,那么char类型的成员变量会被对齐到4个字节的地址上,因此结构体的大小为8个字节。
3. 编译器的实现不同的编译器对结构体的实现方式可能会有所不同,因此同样的结构体在不同的编译器中可能会有不同的大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sizeof进行结构体大小的判断typedef struct{int a;char b;}A_t;typedef struct{int a;char b;char c;}B_t;typedef struct{char a;int b;char c;}C_t;void main(){char*a=0;cout<<sizeof(a)<<endl;//4cout<<sizeof(*a)<<endl;//1--这个能理解cout<<sizeof(A_t)<<endl;//8cout<<sizeof(B_t)<<endl;//8cout<<sizeof(C_t)<<endl;//12}为什么是这样的结果啊?2. 语法:sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象);2) sizeof( type_name ); // sizeof( 类型);3) sizeof object; // sizeof 对象;5. 指针变量的sizeof既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。
所以在32位计算机中,一个指针变量的返回值必定是4(以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
char* pc = "abc";int* pi;string* ps;char** ppc = &pc;void (*pf)();// 函数指针sizeof( pc ); // 结果为4sizeof( pi ); // 结果为4sizeof( ps ); // 结果为4sizeof( ppc ); // 结果为4sizeof( pf );// 结果为4指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM 就能传递各种复杂的消息结构(使用指向结构体的指针)。
6. 数组的sizeof数组的sizeof值等于数组所占用的内存字节数,如:char a1[] = "abc";int a2[3];sizeof( a1 ); // 结果为4,字符串末尾还存在一个NULL终止符sizeof( a2 ); // 结果为3*4=12(依赖于int)一些朋友刚开始时把sizeof当作了求数组元素的个数,现在,你应该知道这是不对的,那么应该怎么求数组元素的个数呢?Easy,通常有下面两种写法:int c1 = sizeof( a1 ) / sizeof( char ); // 总长度/单个元素的长度int c2 = sizeof( a1 ) / sizeof( a1[0] ); // 总长度/第一个元素的长度写到这里,提一问,下面的c3,c4值应该是多少呢?void foo3(char a3[3]){int c3 = sizeof( a3 ); // c3 ==}void foo4(char a4[]){int c4 = sizeof( a4 ); // c4 ==}也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。
这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么?仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗?不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。
7. 结构体的sizeof这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。
让我们先看一个结构体:struct S1{char c;int i;};问sizeof(s1)等于多少?聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。
是这样吗?你在你机器上试过了吗?也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。
Why?为什么受伤的总是我?请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:S1 s1 = { a , 0xFFFFFFFF };定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么?以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下:0012FF78: 61 CC CC CC FF FF FF FF发现了什么?怎么中间夹杂了3个字节的CC?看看MSDN上的说明:When applied to a structure type or variable, sizeof returns the actual size,which may include padding bytes inserted for alignment.原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。
为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。
为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。
这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof 值就增长了。
让我们交换一下S1中char与int的位置:struct S2{int i;char c;};看看sizeof(S2)的结果为多少,怎么还是8?再看看内存,原来成员c后面仍然有3个填充字节,这又是为什么啊?别着急,下面总结规律。
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
对于上面的准则,有几点需要说明:1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏移量了呢?因为有了第1点存在,所以我们就可以只考虑成员的偏移量,这样思考起来简单。
想想为什么。
结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也在stddef.h中定义,如下:#define offsetof(s,m) (size_t)&(((s *)0)->m)例如,想要获得S2中c的偏移量,方法为size_t pos = offsetof(S2, c);// pos等于42) 基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型,这里所说的“数据宽度”就是指其sizeof的大小。
由于结构体的成员可以是复合类型,比如另外一个结构体,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。
但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。
这里叙述起来有点拗口,思考起来也有点挠头,还是让我们看看例子吧(具体数值仍以VC6为例,以后不再说明):struct S3{char c1;S1 s;char c2};S1的最宽简单成员的类型为int,S3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型为int,这样,通过S3定义的变量,其存储空间首地址需要被4整除,整个sizeof(S3)的值也应该被4整除。
c1的偏移量为0,s 的偏移量呢?这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。
最后得到sizeof(S3)的值为16。
通过上面的叙述,我们可以得到一个公式:结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即:sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof(trailing padding )到这里,朋友们应该对结构体的sizeof有了一个全新的认识,但不要高兴得太早,有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。
它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。
#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,公式如下:offsetof( item ) = min( n, sizeof( item ) )再看示例:#pragma pack(push) // 将当前pack设置压栈保存#pragma pack(2)// 必须在结构体定义之前使用struct S1{char c;int i;};struct S3{char c1;S1 s;char c2};#pragma pack(pop) // 恢复先前的pack设置计算sizeof(S1)时,min(2, sizeof(i))的值为2,所以i的偏移量为2,加上sizeof(i)等于6,能够被2整除,所以整个S1的大小为6。
同样,对于sizeof(S3),s的偏移量为2,c2的偏移量为8,加上sizeof(c2)等于9,不能被2整除,添加一个填充字节,所以sizeof(S3)等于10。
现在,朋友们可以轻松的出一口气了,还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。
试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢?于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。
如下:struct S5 { };sizeof( S5 ); // 结果为18. 含位域结构体的sizeof前面已经说过,位域成员不能单独被取sizeof值,我们这里要讨论的是含有位域的结构体的sizeof,只是考虑到其特殊性而将其专门列了出来。