首页 > 后端开发 > C++ > 正文

c++中sizeof运算符如何工作_c++ sizeof运算符工作原理详解

下次还敢
发布: 2025-09-22 14:09:01
原创
425人浏览过
sizeof是编译时运算符,用于获取类型或对象的字节大小,不执行表达式且不影响运行性能;其值基于类型推导,在数组传递中会退化为指针导致大小丢失,结构体大小受内存对齐影响,需用sizeof(arr)/sizeof(arr[0])计算元素个数。

c++中sizeof运算符如何工作_c++ sizeof运算符工作原理详解

在C++中,sizeof 是一个编译时运算符,用于获取数据类型或对象在内存中所占的字节数。它并不在程序运行时计算大小,而是在编译阶段就确定结果,因此不会影响程序运行性能。

sizeof的基本用法

sizeof可以作用于以下几种形式:

  • 基本数据类型:如 sizeof(int)sizeof(char)
  • 变量:如 int x; sizeof(x)
  • • 数组:如 int arr[10]; sizeof(arr)
  • 类或结构体:如 sizeof(MyClass)
  • 指针:如 sizeof(ptr)

返回值类型为 size_t,这是一个无符号整数类型,定义在头文件如 <cstddef> 中。

sizeof的计算时机与原理

sizeof 在编译期完成计算,这意味着它不依赖于变量的实际值,也不执行任何表达式。例如:

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

int a = 5;
sizeof(a = a + 1); // 表达式 a = a + 1 不会被执行
登录后复制

上面代码中,赋值操作不会发生,因为 sizeof 只关心表达式的类型,而不求值(除了变长数组在C中的特殊情况,C++不支持变长数组)。

其工作原理基于类型推导:编译器根据操作数的类型决定其所占内存大小。比如:

  • sizeof(char) 恒为 1
  • sizeof(int) 通常是 4(取决于平台)
  • sizeof(double) 通常是 8

数组与指针中的sizeof差异

这是最容易出错的地方。当数组作为函数参数传递时,会退化为指针,导致 sizeof 失去数组长度信息。

算家云
算家云

高效、便捷的人工智能算力服务平台

算家云 37
查看详情 算家云
void func(int arr[]) {
    cout << sizeof(arr) << endl; // 输出的是指针大小(如 8 字节)
}

int main() {
    int data[10];
    cout << sizeof(data) << endl; // 输出 40(假设 int 为 4 字节)
    func(data);
}
登录后复制

在 main 中,data 是数组,sizeof 返回总字节数;而在 func 中,arr 被当作指针处理,所以只返回指针大小。

要正确获取数组元素个数,可以在编译期使用:

int arr[10];
size_t count = sizeof(arr) / sizeof(arr[0]); // 40 / 4 = 10
登录后复制

结构体和类的sizeof

结构体的大小不仅取决于成员变量的大小之和,还受到内存对齐的影响。

struct Example {
    char c;     // 1 字节
    int i;      // 4 字节
};
登录后复制

这个结构体大小通常不是 5,而是 8。因为编译器为了内存访问效率,在 char 后面填充了 3 个字节,使 int 成员按 4 字节对齐。

你可以通过 #pragma packalignas 控制对齐方式,但需谨慎使用,可能影响性能或跨平台兼容性。

基本上就这些。sizeof 看似简单,但在数组、指针和结构体内存布局中容易产生误解。理解其编译期行为和对齐机制,是写出可靠C++代码的基础。

以上就是c++++中sizeof运算符如何工作_c++ sizeof运算符工作原理详解的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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