当前位置: 首页 > news >正文

C++中的sizeof和strlen详解

在C++中,sizeofstrlen都是用于获取长度或大小的运算符/函数,但它们的用途和工作方式有所不同。以下是对它们的详细解释:

sizeof 运算符

sizeof 是一个编译时运算符,用于计算数据类型或对象的大小(以字节为单位)。它可以用于任何数据类型,包括基本类型、数组、结构体、类等。sizeof 是在编译时计算的,因此它不会在运行时引起性能开销。

使用示例:
#include <iostream>int main() {int a = 10;double b = 3.14;char c = 'A';int arr[10];std::cout << "Size of int: " << sizeof(int) << " bytes\n";std::cout << "Size of double: " << sizeof(double) << " bytes\n";std::cout << "Size of char: " << sizeof(char) << " bytes\n";std::cout << "Size of a: " << sizeof(a) << " bytes\n";std::cout << "Size of b: " << sizeof(b) << " bytes\n";std::cout << "Size of c: " << sizeof(c) << " bytes\n";std::cout << "Size of arr: " << sizeof(arr) << " bytes\n";return 0;
}

输出结果可能类似如下:

Size of int: 4 bytes
Size of double: 8 bytes
Size of char: 1 byte
Size of a: 4 bytes
Size of b: 8 bytes
Size of c: 1 byte
Size of arr: 40 bytes

strlen 函数

strlen 是一个运行时函数,用于计算以 null 结尾的 C 风格字符串(字符数组)的长度,不包括终止字符 '\0'。它在运行时遍历字符串直到找到终止字符 '\0',因此其时间复杂度为 O(n)。

使用示例:
#include <iostream>
#include <cstring>int main() {const char* str = "Hello, World!";std::cout << "Length of str: " << strlen(str) << " characters\n";char str2[] = "C++ Programming";std::cout << "Length of str2: " << strlen(str2) << " characters\n";return 0;
}

输出结果:

Length of str: 13 characters
Length of str2: 14 characters

区别与注意事项

  1. 作用范围不同

    • sizeof 可以用于任何数据类型或对象,计算的是字节大小。
    • strlen 仅用于以 null 结尾的 C 风格字符串,计算的是字符长度(不包括终止字符)。
  2. 计算时间

    • sizeof 是在编译时计算的,不会产生运行时开销。
    • strlen 是在运行时计算的,需要遍历字符串。
  3. 返回类型

    • sizeof 的返回类型是 size_t,通常是一个无符号整型。
    • strlen 的返回类型也是 size_t

通过了解 sizeofstrlen 的区别和用途,可以在编写 C++ 程序时更好地选择适当的工具来获取数据的大小或长度。

相关文章:

  • 【玩转C语言】第三讲---> scanf 和 printf 函数详解(非常重要)!
  • Redisson知识
  • 斯坦福天才少女创5亿独角兽!Pika获8000万融资,金牌团队首曝光
  • 小主机折腾记24
  • 计算机基础(8)——音频数字化(模电与数电)
  • WPF中读取Excel文件的内容
  • 利用keepalived对zabbix-server做高可用,部署安装keepalived
  • 【WEB前端2024】智体OS:poplang编程控制成本小千元的长续航robot机器人底盘(开源)
  • C语言——内存函数
  • Linux 35.5 + JetPack v5.1.3@FC-Planner编译安装
  • 深入解析Java扩展机制:SPI与Spring.factories
  • Python的登录注册界面跳转汽车主页面
  • Rust : windows下protobuf尝试
  • 生物神经网络 原理分析研读02
  • Python流动性做市风险获利 | 信息不对称买卖数学模型
  • 2017年终总结、随想
  • Android优雅地处理按钮重复点击
  • CentOS6 编译安装 redis-3.2.3
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java比较器对数组,集合排序
  • Laravel Mix运行时关于es2015报错解决方案
  • laravel 用artisan创建自己的模板
  • XForms - 更强大的Form
  • 初识MongoDB分片
  • 对超线程几个不同角度的解释
  • 给初学者:JavaScript 中数组操作注意点
  • 关于for循环的简单归纳
  • 开发基于以太坊智能合约的DApp
  • 如何合理的规划jvm性能调优
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 三栏布局总结
  • 用mpvue开发微信小程序
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 【干货分享】dos命令大全
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Redis 入门到精通(七)-- redis 删除策略
  • #include到底该写在哪
  • #pragma multi_compile #pragma shader_feature
  • #在 README.md 中生成项目目录结构
  • (C++17) std算法之执行策略 execution
  • (C语言)字符分类函数
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (NSDate) 时间 (time )比较
  • (Python第六天)文件处理
  • (补充)IDEA项目结构
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四) 虚拟摄像头vivi体验
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转) ns2/nam与nam实现相关的文件
  • (转)shell调试方法
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑