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

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 无法获取动态分配内存的实际大小,需自行记录。
3. sizeof 表达式不求值
sizeof 内部表达式不会真正执行,仅分析类型。
示例:
int x = 0;
cout
这在调试时可能令人困惑,但符合标准:sizeof 是编译期运算。
4. 类和结构体的大小受对齐影响
结构体大小 ≠ 成员大小之和,由于内存对齐,可能存在填充字节。
示例:
struct S {
char c; // 1 字节
int i; // 4 字节,前面可能补 3 字节对齐
};
cout
可通过 #pragma pack 或 alignas 控制对齐方式,但跨平台时需谨慎。
实用技巧
合理使用 sizeof 可提升代码健壮性和可移植性:
计算数组元素个数:
对于本地定义的数组,可用 sizeof(arr)/sizeof(arr[0]) 安全获取长度。初始化内存操作:
配合 memset、memcpy 使用更安全,避免硬编码类型大小。
例如:memset(&obj, 0, sizeof(obj));模板编程中判断类型大小:
可用于 SFINAE 或 static_assert 验证类型尺寸是否符合预期。避免跨平台问题:
不同平台上基本类型大小可能不同(如 long),用 sizeof 可增强可移植性。
总结
sizeof 是 C++ 中强大且高效的工具,但必须清楚它的局限性:不能用于运行时动态大小检测,对传入函数的数组无效,且受对齐规则影响。掌握这些特性有助于写出更安全、可移植的代码。
基本上就这些,关键是理解它在编译期工作,且对数组退化敏感。用好它,能少踩很多坑。
以上就是c++++中sizeof运算符的用法和常见陷阱 _c++ sizeof使用技巧及陷阱解析的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1479624.html
微信扫一扫
支付宝扫一扫