矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: stalk12

请教有没有什么资料专门汇集整理C语言或C++编程代码中的各种奇技淫巧?

[复制链接]
发表于 2023-12-26 11:18:47 来自手机 | 显示全部楼层
iffi123 发表于 2023-12-25 23:01
单片机实时控制的还是几乎是C,C++满足不了代码和效率

esp32使用的处理器Xtensa® 32-bit LX6,  ...

只能说明一点,你的C水平太好了,同时C++水平太弱了。C++对程序员自身要求要高太多,C就温和多了。

战斗机从F16-F35都C++写的控制系统,控制导弹,雷达,发动机等等,那效率要求比民用单片机要求不知道高多少倍…你觉得C++效率会比C低?

从语言本身来看,除了虚函数,C和C++内存布局一样的,没有效率差异。虚函数多一个虚指针而已,为了调用有关函数方便。这个时候C除了加个判断去调对应函数实现某个功能,没有更好的方法。判断的效率怎么可能干得过虚指针做Offset!

C++最糟糕的地方是太复杂,对程序员自身要求太高,C++程序员水平差距大到能用“天上地下”的区别。同样一段程序,用C写就是需求和算法外加规范就差不多了,如果用C++写起码,还得加两项,懂系统和编译器…

如果用C的思维去写C++代码,虽然也能运行,但会像垃圾,如果项目很大,道上混的称之为"屎山一样的代码"…

固然,过客里如果有人觉得C都很难,还是考虑下用Java, C#, 脚本之类的,或者干脆换个行业吧…
回复 支持 反对

使用道具 举报

     
发表于 2023-12-26 14:11:36 | 显示全部楼层
iffi123 发表于 2023-12-26 08:09
支持Arduino不一定是传统意义上的单片机,这一点都不奇怪,我是没玩过,但从隔壁论坛网友反映,基于Ard ...

先说结论:当然可以做到。

说刷屏慢的,基本都是用了通用驱动,然后被 HAL 层拖慢。
你在 C 里边自然不会涉及 HAL,相当于直接针对 MPU 硬件优化了;

如果在 C 里边要求你的代码保持移植性,换个 MPU、换几个脚,要求代码接近 100% 移植,
到头来这种要求就会促生 HAL,到最后就和 Arduino-HAL 一样的结果。

正确的做法,是用 Arduino 通用库调通后,针对效率在特定的点进行 C++ 重载,
然后编写你自己的加速代码,兼顾效率和灵活性。可惜大多数人连 C++ 继承都不太会写。
回复 支持 反对

使用道具 举报

     
发表于 2023-12-26 14:32:28 | 显示全部楼层
t3486784401 发表于 2023-12-26 14:11
先说结论:当然可以做到。

说刷屏慢的,基本都是用了通用驱动,然后被 HAL 层拖慢。

你这样折腾,我还不如直接C来的简洁高效,又何必简单问题复杂化,

但凡遇到一个对实时性要求比较高,或者负荷比较重的应用,就能体会能少一行是一行的感慨,怎么高效怎么来而非怎么方便怎么来,当然点灯键盘扫描外加点刷新慢的简单玩意是可以层层封装也能跑起来

我之前做过一块板,利用stm32f072(主频48M, SPI实际12MHz)通过SPI驱动TF卡,读取FAT32音频文件,再播放, SD帧协议的形成和解码都是软件完成,最后能实现44.1KHz/16bit的流畅播放,DMA和中断全用上,如果再个封装什么的,根本就无法完成

PS:  st的cube mx使用的hal库也是C,而非C++
回复 支持 反对

使用道具 举报

     
发表于 2023-12-26 14:53:35 | 显示全部楼层
iffi123 发表于 2023-12-26 14:32
你这样折腾,我还不如直接C来的简洁高效,又何必简单问题复杂化,

但凡遇到一个对实时性要求比较高, ...

创造性不一样: C++ 适合探索未知需求,C 适合既定目标优化。

另外我并没说 HAL 要和 C++ 绑定,我只说在 C 开发液晶过程中,不涉及针对液晶的 HAL。
stm32 那个 HAL 估计你也会吐槽吧,还不如 LL 来的实在。
回复 支持 反对

使用道具 举报

     
发表于 2023-12-26 15:13:10 | 显示全部楼层
《C++高性能编程》、《Effective C++ 55个改善编程与设计的有效方法》等书籍都是楼主所要的 C,C++很灵活,如果楼主是编程3年以内的新手,应首先注重程序的规范和正确性,现在的CPU性能很高,掩盖了低效的程序,首先学习 Google C/C++ 编程规范, 我使用C C++已经十多年了,感觉还是没有完全掌握,学习不要一开始就扎进C++ 11标准及后续,首先掌握C++98标准就可以了
回复 支持 反对

使用道具 举报

     
发表于 2023-12-26 20:30:45 | 显示全部楼层
现在主要用C,用惯了C,感觉其他语言不趁手
回复 支持 反对

使用道具 举报

     
发表于 2023-12-31 10:36:39 | 显示全部楼层
程序是给人看的,任何人看不懂的程序,都是垃圾,另外用指针并不能提高性能,只能提高灵活性
回复 支持 1 反对 0

使用道具 举报

     
发表于 2023-12-31 10:59:45 | 显示全部楼层
t3486784401 发表于 2023-12-24 14:42
我先来一段,计算 y=1/sqrt(x) :

你这个,如果浮点数的表示方式变了,就玩完了,而且还很难发现问题
回复 支持 反对

使用道具 举报

     
发表于 2023-12-31 11:45:12 | 显示全部楼层
非专业,大概看完C语言,不知道可以干什么。
回复 支持 反对

使用道具 举报

     
发表于 2023-12-31 12:12:30 | 显示全部楼层
zhxzhx 发表于 2023-12-31 10:59
你这个,如果浮点数的表示方式变了,就玩完了,而且还很难发现问题

你觉着哪里会用到这段程序?
回复 支持 反对

使用道具 举报

     
发表于 2024-1-1 07:59:24 来自手机 | 显示全部楼层
t3486784401 发表于 2023-12-25 17:31
那我举个 C++ 的吧,默认 LZ 知道类、运算符重载、模板类这些概念。
这段代码摘自 Arduino 官方 EEPRO ...

c++看着代码简单但是背后执行的代码一点不省。如字符串c=a+b实际执行的代码和C的分配内存然后复制是一样的。然后升级下d=a+b+c那么C++是怎么执行的?根据封装执行就得先分配能容纳a+b内存空间然后复制再分配a+b+c的空间再复制,内存和复制开销变大了。用C你会直接分配a+b+c空间然后复制。效率比c++高得多了。字符串c=a+b那么好用你会放弃不用吗?
回复 支持 反对

使用道具 举报

     
发表于 2024-1-2 10:37:59 | 显示全部楼层
t3486784401 发表于 2023-12-31 12:12
你觉着哪里会用到这段程序?

现在,哪里也用不到这个程序了,这个是当年CPU功能弱小的时候的技巧,现在单片机都有数学辅助处理单元了,正确的做法是把浮点计算交给数学处理器来做.
回复 支持 反对

使用道具 举报

     
发表于 2024-1-2 15:18:28 | 显示全部楼层
本帖最后由 iffi123 于 2024-1-2 15:21 编辑
zhxzhx 发表于 2023-12-31 10:59
你这个,如果浮点数的表示方式变了,就玩完了,而且还很难发现问题


可能是个近似运算,不过我没仔细研究
回复 支持 反对

使用道具 举报

     
发表于 2024-1-2 15:20:27 | 显示全部楼层
本帖最后由 iffi123 于 2024-1-2 15:26 编辑
zhxzhx 发表于 2024-1-2 10:37
现在,哪里也用不到这个程序了,这个是当年CPU功能弱小的时候的技巧,现在单片机都有数学辅助处理单元了,正 ...


是的, 带硬件浮点的U, 比如arm, 本身就有开方根的指令,比软件块多了,做个开根号的运算,只需14个系统时钟周期,72MHz主频, 0.2us就完成,再做个除法也很快.  1/sqrt(x)=sqrt(x)/x
回复 支持 反对

使用道具 举报

     
发表于 2024-1-17 02:17:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-27 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表