0

0

c++中sizeof运算符的用法和常见陷阱 _c++ sizeof使用技巧及陷阱解析

下次还敢

下次还敢

发布时间:2025-10-18 09:37:01

|

975人浏览过

|

来源于php中文网

原创

sizeof运算符在编译时计算类型或对象的字节大小,返回size_t类型,常用于获取数据大小、数组元素个数及内存操作;但存在数组传参退化为指针导致失效、对指针无法获知动态内存大小、表达式不求值、结构体因对齐产生填充等常见陷阱;需结合模板、显式传参、对齐控制等方式规避问题,提升代码可移植性和安全性。

c++中sizeof运算符的用法和常见陷阱 _c++ sizeof使用技巧及陷阱解析

sizeof 是 C++ 中一个非常常用的运算符,用于获取数据类型或对象在内存中所占的字节数。它在编译时计算结果(除了变长数组 VLA 在 C99/C11 中),返回值类型为 size_t。虽然使用简单,但在实际开发中容易因理解偏差导致陷阱。以下详细介绍其用法和常见注意事项。

基本用法

sizeof 可以作用于类型、变量、表达式等:

  • sizeof(类型):获取指定类型的大小
  • sizeof 变量:获取变量占用的字节数
  • sizeof(表达式):计算表达式结果类型的大小,但不求值

示例:

int a;
cout cout cout

常见陷阱与误区

尽管 sizeof 看似简单,但以下几个问题经常引发错误:

立即学习C++免费学习笔记(深入)”;

1. 数组传参后 sizeof 失效
当数组作为参数传递给函数时,会退化为指针,导致无法正确获取数组长度。

错误示例:

void func(int arr[10]) {
    cout }

int main() {
    int data[10];
    cout     func(data);
}

解决方法:使用模板或显式传入大小。

template
void func(int (&arr)[N]) {
    cout }

2. 对指针使用 sizeof 不等于数组长度
初学者常误以为对动态分配或指针数组也能用 sizeof 获取元素个数。

错误用法:

int* ptr = new int[10];
cout

结论:sizeof 无法获取动态分配内存的实际大小,需自行记录。

Dora
Dora

创建令人惊叹的3D动画网站,无需编写一行代码。

下载

3. sizeof 表达式不求值
sizeof 内部表达式不会真正执行,仅分析类型。

示例:

int x = 0;
cout

这在调试时可能令人困惑,但符合标准:sizeof 是编译期运算。

4. 类和结构体的大小受对齐影响
结构体大小 ≠ 成员大小之和,由于内存对齐,可能存在填充字节。

示例:

struct S {
    char c; // 1 字节
    int i; // 4 字节,前面可能补 3 字节对齐
};
cout

可通过 #pragma packalignas 控制对齐方式,但跨平台时需谨慎。

实用技巧

合理使用 sizeof 可提升代码健壮性和可移植性:

  • 计算数组元素个数
    对于本地定义的数组,可用 sizeof(arr)/sizeof(arr[0]) 安全获取长度。
  • 初始化内存操作
    配合 memset、memcpy 使用更安全,避免硬编码类型大小。
    例如:memset(&obj, 0, sizeof(obj));
  • 模板编程中判断类型大小
    可用于 SFINAE 或 static_assert 验证类型尺寸是否符合预期。
  • 避免跨平台问题
    不同平台上基本类型大小可能不同(如 long),用 sizeof 可增强可移植性。

总结

sizeof 是 C++ 中强大且高效的工具,但必须清楚它的局限性:不能用于运行时动态大小检测,对传入函数的数组无效,且受对齐规则影响。掌握这些特性有助于写出更安全、可移植的代码。

基本上就这些,关键是理解它在编译期工作,且对数组退化敏感。用好它,能少踩很多坑。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

295

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1434

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

84

2025.10.17

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

185

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

3

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Rust 教程
Rust 教程

共28课时 | 3.9万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号