c++中如何获取变量的字节数_c++ sizeof运算符用法与注意事项【详解】
技术百科
冰火之心
发布时间:2026-01-23
浏览: 次 sizeof是编译期运算符,返回类型或对象的静态字节数;不能用于动态内存;作用于类型需括号,变量可省略;数组名传参后退化为指针,sizeof失效。
sizeof 不是函数,是编译期运算符,它返回的是类型或对象在当前平台的**静态字节数**,不能用于获取运行时动态分配内存的大小(比如 new 出来的数组长度)。
sizeof 作用于类型和变量的区别
语法上可以写 sizeof(int) 或 sizeof x(x 是变量),但语义一致:都是取该类型定义下的大小。注意括号在类型名时不可省略,变量名可省略。
-
sizeof(int)合法;sizeof int非法(缺少括号) -
sizeof arr和sizeof(arr)等价,但arr必须是数组名(非指针) - 对指针变量用
sizeof,得到的是指针本身的大小(通常是 4 或 8 字节),不是它指向内容的大小
数组名传参后 sizeof 失效的典型陷阱
函数参数中的数组会退化为指针,此时 sizeof 返回指针大小,而非原始数组字节数。
void func(int arr[10]) {
// 这里 arr 已是 int* 类型

std::cout << sizeof(arr) << "\n"; // 输出 8(64 位系统下指针大小),不是 40
}
int main() {
int a[10] = {};
std::cout << sizeof(a) << "\n"; // 输出 40
func(a);
}
- 若需在函数内知道数组长度,必须额外传入
size_t len参数 - 或改用
std::array/std::vector,它们自带.size() - C++20 起可用模板推导:
template,此时void func(int (&arr)[N]) sizeof(arr)有效
结构体/类的 sizeof 受内存对齐影响
sizeof 对结构体返回的是“满足对齐要求后的总占用空间”,通常大于各成员大小之和。
struct S {
char a; // offset 0
int b; // offset 4(跳过 3 字节对齐到 4)
char c; // offset 8
}; // sizeof(S) == 12,不是 1+4+1 == 6- 对齐规则由编译器和目标平台决定,可通过
#pragma pack(n)或alignas修改 -
sizeof结果是编译期常量,可用于栈数组声明:char buf[sizeof(S)]; - 虚函数表指针(vptr)会增加类对象大小,但空基类可能被优化(EBO)
真正容易出错的地方,往往不在怎么写 sizeof,而在于误以为它能反映运行时数据长度,或忽略对齐导致跨平台序列化失败——这两个点,比记住语法重要得多。
# 的是
# 都是
# 得多
# 自带
# 而非
# 这两个
# 已是
# 作用于
# 对象
# c++
# int
# void
# 字节
# 区别
# 指针
# 栈
# 结构体
# char
# len
# 运算符
# 虚函数
# 常量
# Array
# 数组名
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 Go 同包不同文件中正确引用结构体
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- 如何在Golang中使用time处理时间_Gola
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win11怎么格式化U盘_Win11系统U盘格式化
- Win11怎么关闭粘滞键_彻底禁用Windows
- php文件怎么变mp4保存_php输出视频流保存为
- Win10如何更改任务栏高度_Windows10解
- Python对象比较与排序_魔术方法解析【教程】
- Windows10系统怎么查看IP地址_Win10
- 如何在Golang中处理云原生事件_使用Event
- Windows蓝屏错误0x0000002C怎么解决
- Win11怎么退出高对比度模式_Win11取消反色
- 如何理解Go指针和内存分配关系_Go Pointe
- Go 中实现 Python urllib.quot
- php中作用域操作符能访问私有静态属性吗_访问权限
- Windows10任务栏图标变成白色文件_Win1
- 如何在 Go 中正确反序列化 XML 多节点数组(
- php订单日志怎么记录发货_php记录订单发货操作
- 如何在 Go 中调用动态链接库(.so)中的函数
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Go 语言标准库为何不提供泛型 Contains
- Python数据挖掘核心算法实践_聚类分类与特征工
- 如何在Golang中处理二进制数据_Golang
- 如何使用Golang实现路由参数绑定_使用Mux和
- php会话怎么开启_session_start函数
- Laravel 查询 JSON 列:高效筛选包含数
- Python集合操作技巧_高效去重解析【教程】
- Win11如何关闭游戏模式 Win11禁用Xbox
- Python网络异常模拟_测试说明【指导】
- Win11怎么更改任务栏位置_修改注册表将Win1
- 如何使用 Selenium 正确获取篮球参考网站球
- Win11局域网共享怎么设置 Win11文件夹网络
- php删除数据怎么加限制_带where条件删除避免
- Win11怎么关闭小组件_Win11禁用任务栏天气
- c# await 一个已经完成的Task会发生什么
- Python项目回滚策略_发布安全说明【指导】
- PHP主流架构如何做单元测试_工具与流程【详解】
- Win10电脑怎么设置网络名称_Windows10
- Win11怎么设置桌面图标间距_Windows11
- Win11怎么关闭任务栏小图标_Windows11
- 如何在Golang中处理JSON字段缺失_Gola
- Win10如何卸载WindowsDefender_
- Windows系统时间服务错误_W32Time服务
- c++如何使用std::bitset进行位图算法_
- C++ STL算法库怎么用?C++常用算法函数(s
- 静态属性修改会影响所有实例吗_php作用域操作符下
- 如何在Golang中实现基础配置管理功能_Gola
- php怎么下载安装后测试是否成功_简单脚本验证方法


QQ客服