★深入解析sizeof操作符★

合集下载

对C语言中的sizeof的介绍分析

对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这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。

sizeof用法

sizeof用法

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深入理解(vcbase)

sizeof深入理解(vcbase)

sizeof深入理解(vcbase)∙ 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

∙ 2.sizeof是算符,strlen是函数。

∙ 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

sizeof还可以用函数做参数,比如:∙short f();∙printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。

∙ 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

∙ 5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因∙char str[20]="0123456789";∙int a=strlen(str); //a=10;∙int b=sizeof(str); //而b=20;∙ 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

∙7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。

这是因为sizeof是个操作符不是个函数。

∙8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸∙9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:∙fun(char [8])∙fun(char [])都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy 拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}有关内容见: C++ PRIMER?∙10.计算结构变量的大小就必须讨论数据对齐问题。

sizeof在c语言中的用法 (2)

sizeof在c语言中的用法 (2)

sizeof在c语言中的用法一、sizeof在C语言中的用法简介在C语言中,sizeof是一个用来获取数据类型或变量在内存中所占字节数的运算符。

它返回一个无符号整数值,表示所给参数的大小。

sizeof可以用于各种数据类型,包括基本数据类型(如int、float等)、指针、数组和结构体等。

二、sizeof用法详解1. 获取基本数据类型的大小使用sizeof运算符可以获取C语言中各种基本数据类型的大小。

例如,sizeof(int)将返回该机器上int类型所占的字节数。

这对于编写可移植性强的代码非常有用。

2. 获取数组大小通过使用sizeof运算符,可以获取数组在内存中所占空间的大小。

例如,如果有一个整型数组arr,则sizeof(arr)将返回该数组所占的总字节数。

3. 获取指针变量的大小当使用sizeof运算符计算指针变量时,它将返回指针变量本身所占空间的大小,并不会计算指针所引用对象的大小。

这是因为指针只是一个地址值,在32位操作系统上通常占用4个字节,在64位操作系统上通常占用8个字节。

4. 获取结构体大小通过使用sizeof运算符,可以获取结构体在内存中所占空间的大小。

结构体由多个字段组成,而每个字段又可以是不同的数据类型。

sizeof(struct_name)将返回该结构体所占的总字节数。

5. 计算变量的大小sizeof运算符可以用于计算变量在内存中所占空间的大小。

例如,sizeof(variable)将返回变量所占的字节数。

这在动态分配内存或者进行数据传输时非常有用。

6. 获取字符串长度使用sizeof运算符可以获取字符串(字符数组)在内存中所占空间的大小,包括末尾的空字符'\0'。

例如,如果有一个字符数组str,则sizeof(str)将返回该数组所占空间的总字节数。

7. 特殊情况注意事项在使用sizeof运算符时需要特别注意一些情况。

首先,在计算指针变量时,需要明确指针类型,因为不同类型的指针在不同平台上可能占用不同大小的空间。

c语言 sizeof 结构体指针

c语言 sizeof 结构体指针

c语言 sizeof 结构体指针
在C语言中,sizeof操作符用于获取数据类型或变量的大小,
而结构体指针是指向结构体变量的指针。

当我们使用sizeof操作符
来获取结构体指针的大小时,实际上是获取指针变量的大小,而不
是指向的结构体的大小。

在C语言中,结构体指针的大小与指针变量的大小相同,通常
是与系统的位数相关的固定大小。

例如,在32位系统中,指针的大
小通常是4个字节,在64位系统中,指针的大小通常是8个字节。

这意味着无论结构体的大小是多少,结构体指针的大小都是固定的。

结构体指针的大小并不取决于结构体本身的大小,而是取决于
系统架构和编译器的实现。

因此,无论结构体的大小如何,结构体
指针的大小都是固定的。

需要注意的是,结构体指针的大小与结构体本身的大小是不同
的概念。

结构体的大小取决于其成员变量的大小和对齐方式,而结
构体指针的大小只取决于系统架构和编译器的实现。

总之,当你使用sizeof操作符来获取结构体指针的大小时,你
实际上获取的是指针变量的大小,而不是指向的结构体的大小。

这一点在内存分配和指针运算时需要特别注意。

详细解析sizeof()

详细解析sizeof()

一、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。

sizeof在c++中用法

sizeof在c++中用法

sizeof在c++中用法
(实用版)
目录
1.sizeof 的定义与作用
2.sizeof 的基本语法
3.sizeof 的运算规则
4.sizeof 的应用示例
正文
【1.sizeof 的定义与作用】
sizeof 是 C++语言中用于获取数据类型或变量大小的关键字,它返回的是一个整数值,表示数据类型或变量在内存中所占用的字节数。

在程序设计中,了解数据类型或变量的大小对于优化程序性能、避免内存浪费和处理数据时非常必要的。

【2.sizeof 的基本语法】
sizeof 的基本语法如下:
```
sizeof(数据类型或变量);
```
其中,数据类型或变量可以是基本数据类型如 int、float,也可以是复合数据类型如数组、结构体、联合体等。

【3.sizeof 的运算规则】
1.对于基本数据类型,sizeof 返回的值等于该数据类型的大小,如int 为 4,float 为 4,double 为 8。

2.对于复合数据类型,sizeof 返回的值等于该数据类型所占用的最大内存空间。

例如,数组返回的是数组所占用的总空间大小,结构体返回的是结构体所占用的最大空间大小。

3.对于指针类型,sizeof 返回的值等于指针的大小,通常为 4(32 位系统)或 8(64 位系统)。

4.对于数组,sizeof 返回的是数组所占用的总空间大小,而不是数组中元素的大小。

5.对于函数返回值类型,sizeof 返回的是函数返回值所占用的字节数。

c语言中sizeof的含义

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运算符非常重要。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3. 不适用场合 sizeof 操作符不能用于不完全类型定义,例如数组必须有确定的维数,结构体有完整的 成员列表定义。 例: extern int arr[]; struct s; sizeof(arr); // Error sizeof(s); // Error 4. 一般用法 1) 2) 3) 4) 5) 6) 7) cout<<sizeof(int); // 4 double d; cout<<sizeof(d); // 8 char str[]=”0123456789”; cout<<sizeof(str); // 11(注意字符串的结束字符’\0’) char str[100]=”0123456789”; cout<<sizeof(str); // 100 char *p=”0123456789”; cout<<sizeof(p); // 4(p 的类型是字符指针) char *p=(char *)malloc(100); cout<<sizeof(p); // 4(同上) string str(“0123456789”); cout<<sizeof(str.c_str()); // 4(同上)
★深入解析 sizeof 操作符★
更新日期:08/20/2010 1. 描述 sizeof 操作符以字节形式给出了其操作数的存储空间,操作数的存储空间有操作数的类 型决定。操作数可以是变量、类型(需加括号)或表达式。 2. 使用场合 1) 2) 动态分配内存时,计算需要分配的内存空间大小 由于不同平台相同类型的所占的字节数不同,可以使用 sizeof 代替常量计算
6. 高级用法之——struct 的空间计算 总体上遵循三个原则(即内存对齐原则) : (1) 结构体变量的起始地址是占用空间最大的成员(的类型)所占字节数的整倍数 (2) 整体空间是占用空间最大的成员(的类型)所占字节数的整倍数 (3) 内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小 必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。 注意: 数组按照单个变量一个一个的摆放, 而不是看成整体。 如果成员中有自定义的类、 结构体,也要注意数组问题。 看下面的例子:(默认对齐方式下) struct s1 { char a; double b; int c; char d; }; struct s2 { char a; char b; int c; double d; }; cout<<sizeof(s1)<<endl; // 24 cout<<sizeof(s2)<<endl; // 16 同样是两个 char 类型,一个 int 类型,一个 double 类型,但是因为对齐问题,导致他们 的大小不同。计算结构体大小可以采用元素摆放法,我举例子说明一下:首先,CPU 判断 结构体的对界,根据上一节的结论,s1 和 s2 的对界都取最大的元素类型,也就是 double 类 型的对界 8。然后开始摆放每个元素。 对于 s1,首先把 a 放到 8 的对界,假定是 0,此时下一个空闲的地址是 1,但是下一个 元素 d 是 double 类型,要放到 8 的对界上,离 1 最接近的地址是 8 了,所以 d 被放在了 8, 此时下一个空闲地址变成了 16,下一个元素 c 的对界是 4,16 可以满足,所以 c 放在了 16, 此时下一个空闲地址变成了 20,下一个元素 d 需要对界 1,也正好落在对界上,所以 d 放在 了 20, 结构体在地址 21 处结束。 由于 s1 的大小需要是 8 的倍数, 所以 21-23 的空间被保留, s1 的大小变成了 24。 对于 s2,首先把 a 放到 8 的对界,假定是 0,此时下一个空闲地址是 1,下一个元素的 对界也是 1,所以 b 摆放在 1,下一个空闲地址变成了 2;下一个元素 c 的对界是 4,所以取 离 2 最近的地址 4 摆放 c,下一个空闲地址变成了 8,下一个元素 d 的对界是 8,所以 d 摆 放在 8,所有元素摆放完毕,结构体在 15 处结束,占用总空间为 16,正好是 8 的倍数。 这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小,看 下面的例子:
5. 高级用法之——数组的空间计算 数组和指针的 sizeof 运算有着细微的区别。如果数组变量被传入函数中做 sizeof 运算, 则和指针的 sizeof 运算相同,否则会得到整个数组占用内存的总大小。这是因为数组变 量在作为参数传递时会被隐式转换为指针。 例: char str[] = “0123456789”; cout<<sizeof(str); // 11 void func(char str[]) { cout<<sizeof(str); // 4 }
class Derived: public Base{ public: virtual void print() {}; virtual void print2() {}; private: int b; }; cout<<sizeof(Base); // 8(Base.a + 虚函数表指针) cout<<sizeof(Derived); // 12(Base.a + Derived.b + 虚函数表指针) 4)虚继承 对于虚继承的类, 系统会为子类安插一个指向父类的指针, 如果有多个虚继承的父类则 有多个这样的指针。 例: class A{}; class B{}; class C:virtual public A, virtual public B {}; cout<<sizeof(A); // 1(空类) cout<<sizeof(B); // 1(空类) cout<<sizeof(C); // 8(指向 A 的指针 + 指向 B 的指针) 10. 与 strlen()比较 1) 2) sizeof 是操作符, 结果类型为 size_t(unsigned int), 而 strlen 是函数, 返回类型为 size_t。 sizeof 计算数据(包括变量和类型)所占内存空间(需考虑内存对齐) ,用字节数表 示;strlen 只能用以字符’\0’结尾的字符串作参数,计算字符串的字符数(不包括结 尾字符’\0’) 。 sizeof 的值在编译阶段求得,而 strlen 要在运行时才能求得结果。 数组在作为 sizeof 的操作数时,不会隐式转换为指针;而在传递给 strlen 时就隐式 转换为指针。
int b; }; cout<<sizeof(u2); // 16(字节对齐数为 4) 8. 高级用法之——位域的空间计算 在结构体和类中, 可以使用位域来规定某个成员所能占用的空间, 所以使用位域能在一 定程度上节省结构体占用的空间。不过考虑下面的代码: struct s1 { int i: 8; int j: 4; double b; int a:3; }; struct s2 { int i; int j; double b; int a; }; struct s3 { int i; int j; int a; double b; }; struct s4 { int i: 8; int j: 4; int a:3; double b; }; cout<<sizeof(s1)<<endl; // 24 cout<<sizeof(s2)<<endl; // 24 cout<<sizeof(s3)<<endl; // 24 cout<<sizeof(s4)<<endl; // 16 可以看到,有 double 存在会干涉到位域,所以使用位域的的时候,最好把 float 类型和
double 类型放在程序的开始或者最后。 9. 高级用法之——类的空间计算 1)空类 每个类的实例(空类也可以生产实例对象)在内存中都有一个独一无二的地址,为了达 到这个目的, 编译器往往会给一个空类隐含的加一个字节 (不同编译器增加的字节数可能不 一样) ,这样空类在实例化后在内存得到了独一无二的地址。 例(gcc 4.3.4) : class A {}; class B {}; class C {}; cout<<sizeof(A); // 1(不同编译器可能不一样) cout<<sizeof(B); // 1 cout<< sizeof(C); // 1 A a; B b; C c; cout<<&a; // 0x22cd53(具体地址值可能不同) cout<<&b; // 0x22cd52 cout<<&c; // 0x22cd51 2)静态成员变量 在计算类的大小时, 除了考虑内存对齐问题外, 由于静态成员变量不属于类的任何一个 实例,而是存放在全局数据区被类共享,并不计算在类大小里面,我们可以把类的静态成员 变量当做一个特殊的全局变量。例: calss A{ public: int i; static double d; A(); ~A(); } cout << sizeof(A) << endl; // 4 3)虚函数 在计算类的大小时, 如果该类有虚函数, 则系统会维护一个指向该类的虚函数表的指针, 每个表项对应着一个虚函数。 例: class Base{ public: virtual void print() {}; private: int a; };
struct s1 { char a[8]; }; struct s2 { double d; }; struct s3 { s1 s; char a; }; struct s4 { s2 s; char a; }; cout<<sizeof(s1)<<endl; // 8 cout<<sizeof(s2)<<endl; // 8 cout<<sizeof(s3)<<endl; // 9 cout<<sizeof(s4)<<endl; // 16; s1 和 s2 大小虽然都是 8,但是 s1 的对齐方式是 1,s2 是 8(double) ,所以在 s3 和 s4 中才有这样的差异。 所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体 里的元素。 7. 高级用法之——union 的空间计算 整体空间大小是占用空间最大的成员所占字节数。例 1: union u{ int i; char c; float f; double d; short s; }; cout << sizeof(u); // 8 例 2: Union u2{ char arr[13];
相关文档
最新文档