本节我也介绍下sizeof与strlen的区别,很简单,就几条:

1. sizeof是C++中的一个关键字,而strlen是C语言中的一个函数;
2. sizeof求的是系统分配的内存总量,而strlen通常遇到'\0'时即结束求值计算
3. sizeof可以用在任何类、结构体、对象、变量、类型等身上,strlen通常用于求字符串长度;
4. sizeof在计算一个类类型或类对象的的大小时,需要考虑其数据成员的内存布局(编译器可能会保持内存对齐);
5. sizeof是在编译期计算的,而strlen是在运行时计算的, sizeof这个特性使得其在模板编程、元编程中大放异彩;

直接看代码,

 //来自Boost源码,带安全检查指针删除
template<class T> inline void checked_delete(T *x)
{
typedef char type_must_be_complete[ sizeof(T) ? : -]; // 如果T不是完整类型,则此句编译错误!
(void) sizeof(type_must_be_complete);
delete x;
} class A
{
private:
int num;
double score;
char ch;
}; class B
{
private:
char ch;
int num;
double score;
}; int main()
{
int i = ;
std::cout << sizeof(i) << "\n"; //sizeof(i) == sizeof(int) == 4 char str1[] = "hello world";
std::cout << sizeof(str1) << "\t" << strlen(str1) << "\n"; //12 11, 前者是因为为str1总共分配了12个字节大小内存(加上结束符'\0'),而strlen计算时并不加上结束符 char str2[] = "hello world";
std::cout << sizeof(str2) << "\t" << strlen(str2) << "\n"; //100 11, 前者是因为给str2显式分配了100字节大小内存,而strlen计算的是实际长度(后面的没有使用) char *str3 = "hello world";
std::cout << sizeof(str3) << "\t" << strlen(str3) << "\n"; //4 11, 前者是因为str是一个指针,通常一个指针大小是int的大小,即4字节 A a;
std::cout << sizeof(a) << "\t" << sizeof(A) << "\n"; //24 24, sizeof(a) == sizeof(A) == 8+8+8 == 24, 内存对齐 A *b = new A;
std::cout << sizeof(b) << "\t" << sizeof(*b) << "\n"; //4 24, sizeof(b) == sizeof(int) == 4, b是一个指针 std::cout << sizeof(A) << "\t" << sizeof(B) << "\n"; //24 16,sizeof(A) == 8+8+8 == 24, sizeof(B) == 1+4+(3)+8 == 16,括号中的3表示为了对齐而剩余的3个字节 C * c = NULL;
//checked_delete(c); //编译失败,因为C是不完整类型,只有声明,没有定义 system("pause");
return ;
}

输出结果:


话说,就是这样。

我也介绍下sizeof与strlen的区别的更多相关文章

  1. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  2. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

  3. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  4. C++-sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  5. sizeof和strlen的区别和联系总结

    link:http://blog.csdn.net/ghevinn/article/details/9974967    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...

  6. 【转】Sizeof与Strlen的区别与联系

    原文地址:http://www.cnblogs.com/carekee/articles/1630789.html 1.sizeof  sizeof(...)是运算符,在头文件中typedef为uns ...

  7. C++Sizeof与Strlen的区别与联系

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  8. Sizeof与Strlen的区别【转】

    本文转载自:http://www.cnblogs.com/carekee/articles/1630789.html Sizeof与Strlen的区别与联系 一.sizeof    sizeof(.. ...

  9. C++基础--sizeof和strlen的区别

    首先,来运行一段程序: #include "stdafx.h" #include <stdio.h> #include <string.h> int mai ...

随机推荐

  1. 如何快速获取官网帮助信息 (附 11g pdf 文档)

    http://docs.oracle.com/en/ 11g Release 2 (11.2) 搜索时指定网站 site:docs.oracle.com create table site:docs. ...

  2. 检测Linux系统是否支持某系统调用

    随内核版本的变化,会增加一些新的系统调用,但如果glibc没有跟上,则不能直接调用,这个时候可以自己包装一下.如果想知道内核是否支持某系统调用,先得知道它的系统调用ID号,下面代码即是用来检查是否支持 ...

  3. Linux 基础教程 40-df和du命令

    df     df用于显示文件系统的整体磁盘使用量. 基本用法 df [选项] [目录/文件] 其常用选项如下所示: 选项 说明 -a, --all 显示所有文件系统,包括/proc等虚拟文件系统 - ...

  4. Java Annotation Processors

    Table Of Contents 1. Introduction 2. When to Use Annotation Processors 3. Annotation Processing Unde ...

  5. Metasploit学习指南—基础篇

    Metasploit是一款强大的渗透测试平台,其中包括了很多渗透测试利器,本文简单介绍一下Metasploit的配置和基础的使用方法,主要包括以下几个方面: Metasploit的核心 基础的配置 M ...

  6. 8.使用Exists监控ZNode的三大Change事件

    一. zookeeper是一个分布式的协调程序(所有程序都是通过订阅它来相互感知)   1. tcp(长链接) + watcher server ->client client ->ser ...

  7. akka 练手 原来第一次是原封不动的返回传出去的参数

    今天,有介绍akka的文章,就下了个源码的demo练手! 在TimeServer 这个实例中主要就2个文件 server端 static void Main(string[] args) { usin ...

  8. PipelineDB On Kafka

    PipelineDB 安装yum install https://s3-us-west-2.amazonaws.com/download.pipelinedb.com/pipelinedb-0.9.8 ...

  9. 溢出文本省略号表示的css实现及polyfill

    需求经常有需要对文字溢出进行处理,通常是在文字显示部分的末尾添加“...”等.如下:

  10. .NET中的异常处理机制(二)

    本文我们继续通过另一个例子来讲解在C#中如何捕捉异常并进行处理. 首先,我们新建一个控制台应用和一个Class Library Project.如下图所示. 图1 ConsoleUI应用 图2 Exc ...