• sizeof操作符:

sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数。返回值一个常量表达式,类型为size_t。

size_t sizeof(type)

size_t sizeof expr

在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用,sizeof并不需要真的解引用指针也能知道它所指对象的类型。

sizeof对C++的所有内置类型求其所占空间的大小:

环境:win7 64-bits, Code::Blocks 16.01, GUN GCC Compiler with C++11 ISO Standard

Type

Number of bytes

bool

1

char

1

wchar_t

2

char16_t

2

char32_t

4

short

2

int

4

long

4

long long

8

float

4

double

8

long double

12

std::string

4

1. sizeof对数组

传入数组头指针,返回每个元素所占的字节数乘以数组的长度。

2. sizeof对C风格字符串

传入头指针,返回的是字符串长度加上末尾结束符’\0’的总长度。

C风格字符串有两种,一种是指针形式:const char* s = “hello”; 将s传入给sizeof,会认为s为一个指针,返回的是指针所占的字节数。

另一种是数组形式:const char c_str[] = “hello”; 将头指针c_str传给sizeof,是按数组形式的计算所占字节数,返回的是字符串长度加上末尾结束符的总长度。

3. sizeof对指针

传入任意类型的指针,返回值由计算机内存地址总线的宽度决定,32-bits的操作系统返回4,64-bits的操作系统返回8。

4. sizeof对结构体(类)

空的结构体(没有任何成员),返回1,表示仅含占位符;当要构造一个结构体(类)对象时,首先找出所占字节数最长的数据成员,比如是设为x,然后根据所有成员的所占字节数的总和来计算,所申请的字节数最少n个x就能保存完所有数据,则实际对象所占内存字节数为n*x;并且数据成员储存的顺序是根据在结构体内声明的顺序来储存的;对于含有虚函数的结构体(类),其额外包括一个成员——指向虚函数表的虚表指针,在32位的机器上,占4个字节,在64位的机器上,占8个字节,同时也会根据其它数据成员补齐。另外,不考虑函数成员所占的内存,函数成员会储存在代码区,而不是栈区,所以不考虑。

#include <iostream>

using std::cout;
using std::cin;
using std::endl; struct A
{
int a1;
short a2;
char a3;
}; struct B
{
char b1;
int b2;
int b3;
double b4;
}; struct C
{
char c1;
virtual void fun() {}
}; int main()
{
A a;
cout << sizeof(a) << endl; //输出8
//最长int为4,2*4 >= 4 + 2 + 1
//前4个字节储存a1,紧跟着2个字节储存a2,再紧跟着1个字节储存a3
//后面还有1个字节为空,什么也不储存
cout << &a.a1 << " " << &a.a2 << " " << &a.a3 << endl;
B b;
cout << sizeof(b) << endl; //输出24
C c;
cout << sizeof(c) << endl; //输出8 return ;
}

5. sizeof对联合体(union)

union在内存中储存是层叠式的,各成员共享一段内存,因此返回的是所占字节数最长的成员的字节数。例如最长的成员为double,其它无论还有多少个成员且任意小于double的类型,返回的值均为8。

6. sizeof对函数

sizeof对函数操作实际上是求其返回值类型所占的字节数。求值时必须完整地写出函数调用的形式,但并不实际调用函数。

示例程序:

//测试C++中的sizeof()
#include <iostream> using std::cout;
using std::cin;
using std::endl; size_t getPtrSize(char* cptr)
{
return sizeof(cptr);
} struct NoMember
{ };
struct S_int_char
{
char c;
int i;
};
struct S_int_short
{
short s; //sizeof(short) == 2
int i;
};
struct S_int_func
{
int i;
double ret_i() //不考虑
{
return i;
}
};
struct S_ONLY_func
{
double func()
{
return ;
}
}; //联合体
union my_u
{
int a;
float b;
double c;
char d;
}; //函数
short func_short()
{
return ;
}
float func_float(int a, int b)
{
return 1.1;
} int main()
{
//C风格字符串的测试
char c_str[] = "Hello!";
cout << sizeof(char) << " " << sizeof(c_str) << " " << getPtrSize(c_str) << endl; //数组测试
double d_arr[];
cout << sizeof(d_arr) << endl; //返回值为80,4*10 == 80 //指针的测试
char* p;
cout << sizeof(p) << endl; //返回值是4,由计算机内存地址总线的宽度决定
//与所指对象无关 //结构体的sizeof测试
NoMember nm;
cout << sizeof(nm) << endl;
S_int_char sic;
cout << sizeof(sic) << endl; //int是4,char是1,
//为了c与i的空间对齐,对c往后相邻的3个内存加入填充字节
//是空间对齐,则总的空间为i的4加上c的4,得到8
S_int_short sis;
cout << sizeof(sis) << endl; //同样需要内存对齐,返回的也是8
S_int_func sif;
cout << sizeof(sif) << endl; //返回值为4,不考虑成员函数所占的空间
S_ONLY_func sof;
cout << sizeof(sof) << endl; //返回值为1,不考虑成员函数所占的空间 //联合体的测试
my_u u;
cout << sizeof(u) << endl; //返回值为最大的成员所占空间长度,最大为double,返回8 //函数的测试
cout << sizeof(func_short()) << endl;
cout << sizeof(func_float(, )) << endl; return ;
}
  • strlen函数:

strlen函数定义在头文件cstring.h中,用于计算字符串的长度,但空字符’\0’不计算在内。参数为C风格字符串的头指针,返回值是字符串的长度,空字符不计算在内。计算原理是顺着头指针向后找,直到遇到空字符才停下来。注意,如果字符数组没有以空字符结尾,调用strlen()函数可能产生重大错误,因为会不断向前找直到遇到空字符。例如:

char ca[] = {‘a’, ‘b’, ‘c’}; //不以空字符结束
cout << strlen(ca) << endl; //严重错误

示例程序:

#include <iostream>
#include <cstring>
int main()
{
//腾讯实习软开 2016-04-03
const char* s = "hello tencent.\0";
const char c_str[] = "hello tencent.\0";
cout << sizeof(s) << " " << strlen(s) << " " << sizeof(c_str) << endl;
return ;
}

测试输出:

C++中sizeof操作符与strlen函数的更多相关文章

  1. 字符串 前篇 ---- sizeof()操作符和strlen()库函数

    本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...

  2. sizeof运算符和strlen函数的区别

    1.sizeof是运算符,而strlen是函数. 2.sizeof操作符的运算结果为size_t,他在头文件中的typedef为unsigned int.该类型保证能容纳所操作对象的最大字节大小. 3 ...

  3. sizeof运算符和strlen()函数

    首先放上代码和运行结果.(在VC6.0上运行) #include<stdio.h> #include<string.h> int main(void) { char s1[]= ...

  4. java中的==操作符和equals函数

    基本规则 “==”操作符的使用需要分成两种情况 判值类型相等 这一点很好理解,两个值类型代表的数值相等,则“==”表达式返回true “==”可以用与不同值类型的比较,语言会自动进行类型转换 判引用类 ...

  5. C++ sizeof操作符的用法和strlen函数的区别

    摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和 ...

  6. c语言之sizeof总结+strlen函数

    一.sizeof的概念 Sizeof是C语言的一种单目操作符,如C语言的其他操作符++.–等.它并不是函数.Sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类 ...

  7. C语言strlen函数和sizeof操作符

    字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...

  8. strcpy,strlen, strcat, strcmp函数,strlen函数和sizeof的区别

    //计算字符串实际长度        //strlen()函数:当遇到'\0'时,计算结束,'\0'不计入长度之内,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0 ...

  9. CC++中sizeof函数的用法

    C/C++中sizeof()函数的用法 学习C/C++有时会遇到下面的情况: 已知 char *str1="absde"; char str2[]="absde" ...

随机推荐

  1. Python 10min系列之面试题解析丨Python实现tail -f功能

    关于这道题,简单说一下我的想法吧.当然,也有很好用的 pyinotify 模块专门监听文件变化,不过我更想介绍的,是解决的思路. 毕竟作为面试官,还是想看到一下解决问题的思路,而且我觉得这一题的难点不 ...

  2. 【敏捷】7.showcase,开发中必须引起重视的小环节

    有人说,测试者来自火星,开发者来自金星.这是因为软件测试员和软件开发者就好比一对冤家,里面的缘由说不清也道不明.开发代表着创造,而测试则代表着摧毁,因为测试的目的就是以各种方式不断地从开发出的产品中发 ...

  3. 腾讯x5webview集成实战

    应用中许多网页由于优化的不够理想,出现加载慢,加载时间长等,而且因为碎片化导致兼容性问题,有一些网页有视频内容,产品还提出各种小窗需求,搞得心力憔悴.找到公开的有crosswalk和x5webview ...

  4. 动态权限<三>华为小米特殊机制

    动态权限对于谷歌来说从android6.0引入,对于国内的rom来说,这个题目不是好的选择题.因为大多数时候由于使用群众的层次不同,有些人在乎隐私的泄露,而更多的人却并不关心,使用了动态权限,增加了用 ...

  5. CSS动画transform、transition和animation的区别

    CSS3属性中关于制作动画的三个属性:Transform,Transition,Animation. 1.transform:描述了元素的静态样式,本身不会呈现动画效果,可以对元素进行 旋转rotat ...

  6. 初学者下载使用Python遇到的问题看它就行了

    首先在python管网(www.python.org)中找到对应的版本与系统,以(window7系统64位python3.7.3为例) 打开电脑--打开浏览器--输入www.python.org--d ...

  7. C# 通过copydata实现进程间通信

    最近公司需要实现一个基于copydata进程间通信的功能.原来一直没有接触过Windows的进程通信,这次正好可以学习一下. 程序是基于Winform的,下面直接上代码. 公共类: public cl ...

  8. BAT面试必备——Java 集合类

    本文首发于我的个人博客:尾尾部落 1. Iterator接口 Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.它的一个子接 ...

  9. IEEE1588 verision 2 报文介绍

    PTP 报文 PTP verision 2 报文是由 报头 / header,主体 / body 和 报尾 / suffix 组成,报尾长度可能为 0 ; PTP verision 2 报文在 ver ...

  10. eclipse以MapReduce本地模式运行程序

    1.准备好所需的文件winutils.exe.hadoop-eclipse-plugin-2.7.3.jar.hadoop-common-2.2.0-bin-master.zip 下载路径:http: ...