类的sizeof计算

中文有图有真相英文版非常清晰http://wanzimmm.blog.163.com/blog/static/12010038820099115250151/
根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分,聚或者物品之间的有趣关联. 机器学习分 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
<think>嗯,用户想了解如何在C/C++中使用sizeof计算数组的大小。首先,我需要回顾一下sizeof的基本用法。sizeof运算符可以返回对象或型占用的字节数。对于数组来说,sizeof(数组名)应该返回整个数组的总字节数。例如,如果有一个int数组a,里面有5个元素,每个int占4字节,那么sizeof(a)应该是20字节。 然后,用户可能需要知道如何通过sizeof计算数组的元素个数。通常的做法是用整个数组的大小除以单个元素的大小,也就是sizeof(a)/sizeof(a[0])。这里要注意的是,数组名在作为sizeof的操作数时,不会退化成指针,所以能正确得到数组的总大小。这一点很重要,尤其是在处理数组作为函数参数的时候,因为此时数组会退化为指针,sizeof就无法正确得到数组大小了。例如,在函数内部使用sizeof(参数)的话,得到的只是指针的大小,而不是数组的大小。所以用户需要注意,这种方法只能在数组定义的同一作用域内使用。 接下来,我应该举一些例子来说明正确的用法。比如定义一个数组int a[5],用sizeof(a)得到总字节数,sizeof(a[0])得到每个元素的大小,然后相除得到元素个数5。还要指出常见的错误情况,比如当数组作为函数参数传递时,函数内部无法通过sizeof计算数组大小,这时候需要额外传递数组长度参数。 用户可能还会遇到多维数组的情况,这时候同样可以用sizeof计算。例如二维数组int b[3][4],总大小是sizeof(b),每个元素是sizeof(b[0][0]),总元素个数是sizeof(b)/sizeof(b[0][0])。或者计算行数和列数,比如行数是sizeof(b)/sizeof(b[0]),列数是sizeof(b[0])/sizeof(b[0][0])。 需要注意的是,当数组是指针动态分配的时候,比如用malloc分配的数组,sizeof也无法正确计算大小,因为此时变量实际上是一个指针,而不是数组型。这时候用户必须自己记录数组的长度。 另外,用户提到的站内引用资料中提到数组作为参数传递时的问题,这点需要强调。比如引用[2]里说的,函数内使用sizeof(g)/sizeof(g[0])可能得到错误的结果,因为g已经退化为指针。所以正确的做法是在传递数组时,同时传递数组的长度参数,或者在数组定义的作用域内计算好长度再传递。 最后,总结正确的使用步骤和注意事项,确保用户理解适用的场景和限制。可能还需要提醒用户,在C++中,可以考虑使用容器如std::array或std::vector来避免手动计算长度的问题,但用户的问题明确是关于C/C++数组的,所以需要专注于原生的数组处理方法。</think>在C/C++中,使用`sizeof`运算符计算数组大小需注意作用域和数据型特性,具体步骤如下: ### 一、基本原理 1. **数组总字节数**:`sizeof(数组名)`返回数组占用的总内存字节数,例如: ```c int a[5]; printf("%zu", sizeof(a)); // 输出20(假设int占4字节) ``` 2. **单个元素字节数**:`sizeof(数组名[0])`获取单个元素占用的字节数,例如: ```c printf("%zu", sizeof(a[0])); // 输出4 ``` 3. **元素数量计算**:通过总字节数除以单个元素字节数: $$元素数量 = \frac{sizeof(数组名)}{sizeof(数组名[0])}$$ ```c int len = sizeof(a)/sizeof(a[0]); // 计算结果为5 ``` ### 二、注意事项 1. **仅限原始作用域**:当数组作为函数参数传递时,会退化为指针,此时`sizeof(形参)`得到的是指针大小而非数组大小[^2]: ```c void func(int arr[]) { printf("%zu", sizeof(arr)); // 输出8(64位系统指针大小) } ``` 2. **动态分配数组不适用**:对`malloc`创建的数组,`sizeof`无法计算实际长度: ```c int* dyn_arr = malloc(5 * sizeof(int)); printf("%zu", sizeof(dyn_arr)); // 输出指针大小(8字节) ``` 3. **多维数组计算**: ```c int b[3][4]; int rows = sizeof(b)/sizeof(b[0]); // 计算行数(3) int cols = sizeof(b[0])/sizeof(b[0][0]); // 计算列数(4) ``` ### 三、代码示例 ```c #include <stdio.h> int main() { int arr[] = {1,2,3,4,5}; int length = sizeof(arr)/sizeof(arr[0]); // 正确计算方式 printf("数组长度:%d", length); // 输出5 return 0; } ``` ### 四、应用场景对比 | 场景 | 可用性 | 原因说明 | |---------------------|--------|---------------------------| | 局部定义的静态数组 | ✅ | 保持完整数组型信息 | | 函数参数传递的数组 | ❌ | 退化为指针 | | `malloc`动态数组 | ❌ | 本质是指针型 | | 全局/静态存储区数组 | ✅ | 型信息完整保留 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值