我也介绍下sizeof与strlen的区别
本节我也介绍下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的区别的更多相关文章
- sizeof和strlen的区别
一.sizeof sizeof(...)是运算符,而不是一个函数. sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...
- Sizeof与Strlen的区别与联系
转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof sizeof(...)是运算符,在头文件中typedef为uns ...
- Sizeof与Strlen的区别与联系(转)
Sizeof与Strlen的区别与联系 一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...
- C++-sizeof和strlen的区别
一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等. 它的功能是:获得保 ...
- sizeof和strlen的区别和联系总结
link:http://blog.csdn.net/ghevinn/article/details/9974967 strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...
- 【转】Sizeof与Strlen的区别与联系
原文地址:http://www.cnblogs.com/carekee/articles/1630789.html 1.sizeof sizeof(...)是运算符,在头文件中typedef为uns ...
- C++Sizeof与Strlen的区别与联系
一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等. 它的功能是:获得保 ...
- Sizeof与Strlen的区别【转】
本文转载自:http://www.cnblogs.com/carekee/articles/1630789.html Sizeof与Strlen的区别与联系 一.sizeof sizeof(.. ...
- C++基础--sizeof和strlen的区别
首先,来运行一段程序: #include "stdafx.h" #include <stdio.h> #include <string.h> int mai ...
随机推荐
- Windows下安装Redis及php的redis拓展教程
一.安装前必读 Windows 64位操作系统 Redis 安装包(版本3.0.5,截止2017-05-29最新redis版本为3.2.9) 注意事项: 1.在window下如果你还需安装php的re ...
- IDEA配置spring
大半天都在看spring,以前总是看不下去,这次慢慢来,慢慢看. 看那些基础的,倒是还不错.好多都是关于helloworld的,写完helloworld,觉得不怎么形象.于是写了动物,作为接口. (1 ...
- 在DOS命令行窗口中显示系统环境环境变量
(这是一个小技巧) 示例命令: echo %path% path是系统环境变量,使用百分号包围起来 http://www.cnblogs.com/danzhang 张洪君 微软ALM MVP
- Bug报告提交规范
首先声明,bug的测试规范应该在公司的正式文档建立.本建议非正式文档,有些内容可能不正确,有些内容可能需要继续商榷,甚至有些内容同公司规范有冲突.如果发现问题,直接忽略本文相应内容.本帖本意仅就工作中 ...
- linux 添加用户到sudo中
步骤 1. 先切到root用户 2. 执行visudo,其实就是修改/etc/sudoers 3. 添加用户,规则如下: youuser ALL=(ALL) ALL %youuser ALL=(ALL ...
- 扫描指定ip的端口(C#)
class PingExam { public static void Main() { Ping ping = new Ping(); string ip = "192.168.1.43& ...
- sql server还原到指定时间
BACKUP LOG yjxy_1010 TO DISK='d:\yixy_log.bak' WITH FORMAT 数据库右击->任务->还原->还原事务日志.
- DP刷题
http://blog.csdn.net/a1dark/article/details/17115137
- Web Api 端点设计 与 Oauth
最近一直看这方面的东西,总结如下: 在后续会进行实例demo演示,本篇进行理论详解. 下篇相关博客: <Web Api 内部数据思考 和 利用http缓存优化 Api> <API接口 ...
- “全栈2019”Java异常第一章:什么是异常?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...