sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符。 常见的使用方式: int a=10; int arr=[1,2,3]; char str[]="hello"; int len_a = sizeof(a); int len_arr = sizeof(arr =%d,len_short=%d,len_double=%d", sizeof(int), sizeof(short), sizeof(double)); 获取某个数据类型所占用空间的字节数。 (b), sizeof(c), sizeof(d), sizeof(e), sizeof(f), sizeof(arr), sizeof(str), sizeof(p), sizeof(i)); int arr[]={1,2,3}; for(int i=0;i<(sizeof(arr)/sizeof(int));i++){ printf("%d,",arr[i]); } C/C++中,sizeof
php
$cars=array("Volvo","BMW","Toyota");
echo sizeof($cars);
? >
定义和用法
sizeof() 函数计算数组中的单元数目或对象中的属性个数。
注释:当变量未被设置,或是变量包含一个空的数组,该函数会返回 0。 语法
sizeof(array,mode);
参数 描述
array 必需。规定数组。
mode 可选。规定模式。可能的值:0 - 默认。不计数多维数组中的所有元素。 "BMW"=>array
(
"X3",
"X5"
),
"Toyota"=>array
(
"Highlander"
)
);
echo "常规计数:" . sizeof
";
echo "递归计数:" . sizeof($cars,1);
?>
Redis的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生。 当Slave启动并连接到Master之后,它将主动发送一个SYNC命令( 首先Master会启动一个后台进程,将数据快照保存到文件中[rdb文件] Master 会给Slave 发送一个Ping命令来判断Slave的存活状态 当存活时 Master会将数据文件发送给Slave 并将所有写命令发送到Slave )。Slave首先会将数据文件保存到本地 之后再将 数据 加载到内存中。当第一次链接 或者是 故障后 重新连接 都会先判断Slave的存活状态 在做全部数据的同步 , 之后只会同步Master的写操作(将命令发送给Slave)
一.sizeof介绍 sizeof是一个关键词也是操作符,专门用来计算类型或者变量大小,其实sizeof也可以计算数组的大小,单位都是字节。 sizeof操作符的操作数可以是类型,也可以是变量或者表达式。 sizeof(类型) sizeof 表达式 sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号。 sizeof后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。 sizeof的计算结果是size_t类型的。 //数组大小/每个元素的字节 printf("%d\n", sz); return 0; }//打印10 二.strlen strlen 是一个 C 语言库函数,它返回一个字符串的长度 strlen 函数的返回值是字符串的长度,不包括字符串结尾的空字符('\0')。
C语言中:fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。 下面我们来看看c语言fread函数的用法。 fread()函数—- Reads data from a stream. (i=0;i<25;i++) { list[i]=(char)(‘z’-i); } /*write 25 characters to stram*/ numwritten=fwrite(list,sizeof =NULL) { numread=fread(list,sizeof(char),25,stream); printf(“Number of items read =%d\n”,numread);
这里就不讨论一般的数组长度计算了,只说明一下任何数据到了函数的形参中都将退化为指针,所以计算大小的时候,也是计算的指针的大小 直接上代码了 1 // class sizeof测试.cpp : 定义控制台应用程序的入口点 include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 int f1(int num[]) 8 { 9 return sizeof (num); 10 } 11 int f2(int num[5]) 12 { 13 return sizeof(num); 14 } 15 16 int _tmain(int argc, _TCHAR * argv[]) 17 { 18 int num[5]={1,2,3,4,5}; 19 cout<<sizeof(num)<<endl<<sizeof(f1(num))<<endl<< sizeof(f2(num)); 20 return 0; 21 } vs2010在32位系统中的运行结果是 20,4,4
sizeof操作符的结果类型是size_t,他在头文件中的typedef为unsigned int类型 sizeof是运算符,strlen是函数 sizeof可以用类型做参数,strlen只能用char sizeof还可以用函数做参数。 数组作sizeof的参数不退化,传递给strlen就退化为指针 大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度。 sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是一个操作符,而不是函数。 当使用了一个结构类型或变量时,sizeof返回实际的大小。 数组作为参数传给函数时传递的是指针而不是数组,传递的是数组的首地址。 sizeof操作符不能用于函数类型,不完全类型或位字段。 由于操作数的字节数在实现时可能会出现变化,建议在设计操作数字节大小时用sizeof代替常量计算。 如果操作数是函数中的数组形参或函数类型的形参,sizeof给出指针的大小。
strlen函数原型 size_t strlen(const char *string) size_t 是无符号整数的别名,在vs2008编译器中可以查看其宏定义 typedef unsigned 返回值 在MSDN文档中查看strlen函数的返回值,叙述如下。 每个函数都返回字符串中的字符数,不包括终端NULL。不保留返回值以指示错误。 sizeof()运算符 很对人以为sizeof是用来计算数据类型大小的一个函数,这其实是一个误区,它同加减乘除一样是运算符。 ,所以输出均为10 而经过strlen计算字符串长度,由其函数特性,在str1数组中,当遇到第一个数字0是strlen函数就已经结束。
语法:sizeof有两种语法: sizeof(type_name); //sizeof(类型); char**ppc=&pc; void(*pf)(); //函数指针 ; sizeof(对象): 对象的实际占用空间大小; sizeof(函数): 函数的返回类型所占的空间大小。 函数的返回类型不能是void 附: sizeof和strlen的区别: sizeof求的是占用内存的大小,strlen求的是字符串的实际长度;(sizeof统计'\0',strlen不统计'\0') sizeof 是算符,strlen是函数; sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的;(sizeof还可以用函数做参数) 数组作为参数传给函数时传的是指针而不是数组
0) = 0 * * sizeof’(S, i) = ceil(sizeof’(S, i - 1) / sizeof(Mi)) * sizeof(Mi) + sizeof(Mi) (其中ceil为向上取整函数 (sizeof’(S, i - 1) / sizeof(Mi)) * sizeof(Mi) + sizeof(Mi) (其中ceil为向上取整函数) * * maxsizeof = max(sizeof ,每一个包含至少一个虚函数的类型都会有一张虚函数表,每一个对应类型的实例都存有一个虚函数表指针指向该类型的虚函数表,一般来讲虚函数表指针都放在类型实例内存布局的首部. 首先放置B1的虚函数指针(I会复用该虚函数表指针) b. 接着放置B1的数据成员,并逐个执行内存对齐 c. 接着放置B2的虚函数指针(如果有的话) d. 重排)成了(Bi, B1, B2, …, Bi-1, Bi+1, …, Bn));如果基类都没有虚函数表,但是I自身有虚函数表的话,I的首部则会放置自身的虚函数表指针,否则,I会复用第一个有虚函数表的基类的虚函数表指针
在函数的说明文档里,有些时候某个函数的某个参数的说明是这样: /* Maximum length of zSql in bytes. */ 有的函数又是这样写的: The size of the 所以in bytes的时候,传入sizeof(szBuf)就行了。比如我在《 sqlite的C语言使用 》讲过的sqlite3_prepare函数,第三个参数就传入sizeof(zSql)。 在没开启uncide的情况下,就算sizeof和_countof用混了,也不影响程序最终运行。 如果这时候,函数里用混的话,可能会出现意想不到的结果。 比如这类函数:strcpy_s,strcat_s,wcscpy_s..这种字符串操作的函数都是传入字符串的长度,也就是_countof,以后一定不要错了。
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;
sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 类型——该类型所占的空间大小; 对象——对象的实际占用空间大小; 函数——函数的返回类型所占的空间大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。 sizeof还可以用函数做参数,比如: short f(); printf(“%d\n”, sizeof(f())); 输出的结果是sizeof(short),即2。 7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
a); printf("%d\n", sizeof(int)); return 0; } 运行结果如下: 2.strlen函数 strlen是C语⾔库函数,功能是求字符串 ⻓度 。 函数原型如下: size_t strlen ( const char * str ); 统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前 字符串中字符的个数 strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在 越界查找 。 (arr1)); printf("%d\n", sizeof(arr1)); return 0; } 运行结果如下: 3.sizeof与strlen的对比 sizeof: 1. strlen是库函数,使⽤需要包含头⽂件 string.h 2. srtlen是求字符串⻓度的,统计的是 \0 之前 字符的隔个数 3.
首先放置B1的虚函数指针(I会复用该虚函数表指针) b. 接着放置B1的数据成员,并逐个执行内存对齐 c. 接着放置B2的虚函数指针(如果有的话) d. 重排)成了(Bi, B1, B2, …, Bi-1, Bi+1, …, Bn));如果基类都没有虚函数表,但是I自身有虚函数表的话,I的首部则会放置自身的虚函数表指针,否则,I会复用第一个有虚函数表的基类的虚函数表指针 = ceil(0 / 4) 4 + 4 = 4 (b2的虚函数表指针,I会复用该指针) sizeof’(I, 2) = ceil(sizeof’(I, 1) / alignof(b2.vbptr)) 4 = 4 (b2的虚函数表指针,I会复用该指针) sizeof’(I, 2) = ceil(sizeof’(I, 1) / alignof(b2.m_2)) alignof(b2.m_2) + sizeof alignof(b3.vptr) + sizeof(b3.vptr) = ceil(5 / 4) 4 + 4 = 12 (b3的虚函数表指针) sizeof’(I, 4) = ceil(sizeof’(
文章目录 一、sizeof 函数 二、数据类型大小 三、代码示例 一、sizeof 函数 ---- sizeof() 函数可以计算 数据类型 的大小 ; sizeof (类型说明符/表达式) 可以向函数中传递 () 函数 计算 数据类型大小 ; 上述 sizeif(a) 的值为 4 , sizeof(array) 的值是 40 ; a 表达式类型是 int , 该类型占据 4 字节的内存空间 ; ; C 语言编译器 解析到 int a; 代码时 , 就会给 a 变量分配 4 字节大小的内存空间 ; 三、代码示例 ---- 代码示例 : #include <stdio.h> /* * 函数入口 argc, char **args) { // 编译器分配 4 字节内存 int a; // 编译器分配 40 字节内存 int array[10]; // sizeof (a)=4, sizeof(array)=40 printf("sizeof(a)=%d, sizeof(array)=%d\n", sizeof(a), sizeof(array));
首先要明确sizeof不是函数,也不是一元运算符,它是个类似宏定义的特殊关键字,特别是sizeof(string)=4。 不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。 看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。 类型,所以等价于 sizeof( double ); 3、函数的sizeof 函数类型 考虑下面的问题: <code class="language-c++ hljs cpp has-numbering <em>sizeof</em>,在编译阶段会被<em>函数</em>返回值的类型取代 4、数组的<em>sizeof</em> <code class="language-c++ hljs cpp has-numbering" style="display
前言 本篇仅仅是为了更加了解sizeof操作符和strlen函数练习. 对于多条sizeof操作符和strlen函数出现,可能很容易造成头脑不清晰,做题时容易混乱. ("%d\n", sizeof(a + 0)); //2 printf("%d\n", sizeof(*a)); //3 printf("%d\n", sizeof(a + 1)); //4 printf("%d\n", sizeof(a[1])); //5 printf("%d\n", sizeof(&a)); //6 printf("%d\n", sizeof(*&a)); arr表示整个数组的地址,占4/8个字节. 6. 4/8个字节: &arr+1表示数组最后一个元素的后一个位置的地址.4/8个字节 7. 4/8个字节: 表示第二个元素的地址.4/8个字节 strlen函数从参数处开始 希望通过这些练习能更加清楚的指针,通过sizeof和strlen函数里面的参数,指针的来回变化会加深对指针的理解.
(2)&testfunc代表一个函数指针,指针大小是4,所以sizeof(&testfunc)==4。 testfunc()代表一次函数调用,返回值类型是char,所以sizeof(testfunc())==sizeof(char)==1。 testfunc名本身就是一个函数指针,所以(*testfunc)()也是一次函数调用,sizeof((*testfunc)())==sizeof(char)==1。 ****d)=sizeof(double)==8 当数组作为函数形参时,下面的i和j的值应该是多少呢? 这里函数参数a1已不再是数组类型,而是蜕变成指针,相当于char* a1,为什么?仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗?不会!
union U { int i; char c; S1 s; }; 3.sizeof计算类 类是C++中常用的自定义构造类型,有数据成员和成员函数组成,进行sizeof计算时,和结构体并没有太大的区别 C++中类同结构体没有本质的区别,结构体同样可以包含成员函数,构造函数,析构函数,虚函数和继承,但一般不这么使用,沿用了C的结构体使用习惯。 (2)类的成员函数并不影响类对象占用的空间,类对象的大小是由它数据成员决定的。 (3)类和结构体一样,同样需要对齐,具体对齐的规则见上文结构体的内存对齐。 (4)类如果包含虚函数,编译器会在类对象中插入一个指向虚函数表的指针,以帮助实现虚函数的动态调用。 所以,该类的对象的大小至少比不包含虚函数时多4个字节。如果考虑内存对齐,可能还要多些。 如果使用数据成员之间的对齐,当类对象至少包含一个数据成员,且拥有虚函数,那么该对象的大小至少是8B,读者可自行推导。