菜菜博士

博士在网络的家

把闭包变成函数指针—— trampoline 原理解析

序 十年前,我曾经写过一个让 C 形式的回调函数支持 闭包的小转换工具, 见这。 那时候,我说过,要想把 boost.function 传给 C 接口,那这个 C 接口,必须得带一个 void* user_data 的参数。 比如 typedef int (*callback_t)(int arg1, int arg2, void* user_data); bool registe...

重提类型擦除器

序 十年前,我曾经写过一篇有关类型擦除器的文章, 见这。 十年后,我打算再探讨下类型擦除器。 C++ 对 多态 的支持,在核心层面,就两条: 虚继承 和 模板。 假设你要设计一个 线程池。这个池你可以“投递”各种任务进去。 什么叫”任务“呢? 就是一段代码。于是,早期你想到,可以使用 函数指针。 于是你的 线程池长这样 class threadpool { typedef v...

类型萃取技术:函数签名当模板参数

序 在 上一篇 文章里,我提到了 std::function 的模板参数,是一个叫函数签名 的东西。 什么是函数签名? 比如 main 函数,他的签名是 int(int, char**)。所谓函数签名,是指函数声明去掉 函数名和变量名 后得到的一个精简描述。 这个精简描述,指导编译器如何按”调用约定“产生具体的汇编指令以调用一个函数。 函数名,不过是在最后的 call 指令里,提供了...

不需要void*user_data的闭包封装

一般来说,如果 C api 接受一个回调,通常会额外允许设置一个 void* 的回调参数。 用户可以把一些额外的参数用这个 void* 传给回调函数。 比如 typedef void (*read_function_t)(const char* read_buf, int read_size, void* user_data); int register_read_callback(re...

微软不会起名

微软不会起名,而且名字还具有极大的误导性。 先说类名: 首先,微软的协程原作者,他总是用 Task<> 来命名一个协程函数。但是这就是他犯的第一个错误。 因为只有 await 构成的一系列调用,那条调用链才是一个 “任务”。 也就是 asio 作者所说的 co_spawn. 只有被 spawn 出来的协程,才叫一个任务。而被 await 的函数,不能叫任务,而是”可异步等待返...

西方饮食的超高热量

西洋人做食物,最喜欢放的一种调料,叫“黄油”。没有黄油洋人就活不下去。 洋人对黄油的喜爱到了何种地步? 制作面包的时候, 是 面粉+白糖+黄油 1:1:1 混合。烤熟后的面包,吃之前要抹黄油。 偏偏黄油(butter)在英语里,不带油字。做出来的面包,也没有油腻腻的视觉观感。 于是乎,洋人就会说,中国人吃的炒菜放超级多的油,不健康。他们吃的面包就很健康。 其实西洋面包,里面的油,比肉...

从模板的模板论程序员的美学

在编写 µcoro 的时候,曾经对一个模板类的成员函数犯难了。那就是等待器三件套之一的 await_suspend 函数。 我为template<typename T> class awaitable 的三件套使用这样一个模板签名 template<typename PromiseType> auto await_suspend(std::coroutine_ha...

老王语录

苹果手机目前在国内主要就是果粉和小姐在用。 国人大部分开源的项目压根就没有什么洋人感兴趣,不过就是一厢情愿的跪舔洋人而已。 这些觉的自己母语低一等的人啊,往往又经常在简中社区求关注。 8k没意义?那些保守党早在1080p时就说过同样的话,不需要4k,如果不是科技推着他们走,他们什么都不需要,电脑也是多余的,他们会说,...

µcoro 介绍

什么是 µcoro (ucoro) µcoro 是一个最小化的c++20协程库。精简到不能再删一行代码。 什么是 c++20协程 要理解 c++20 协程,首先要理解 无栈协程。 要理解无栈协程,首先要理解“调用链”。 调用链 函数,是被“调用”的。函数 A 调用 函数 B, 函数 B 再调用 函数 C。意思就是当 C 执行完工作,它返回就会回到 B 函数里调用C的那个地方。然后...

猪油有利于减肥

为啥会肥胖 要减肥,首先要理解,人为什么会变肥。 人要活着就要消耗能量。而人体的能量来源,主要靠葡萄糖。 人体有两大储能系统: 血液和脂肪。 血液里含有葡萄糖,这是直接储蓄,类比为“活期存款”。血糖会随着代谢的进行被源源不断的消耗,同时也会随着消化的进行,源源不断的被补充进来。 如果血糖的浓度偏离了一个正常值,就会激发人体的代偿机制: 将多余的葡萄糖转换为脂肪或者反过来,将多余的脂...

同居是没有保障的婚姻

现代女性恐惧婚姻,却不恐惧同居。反而欣欣向荣。 然而,同居就是没有保障的婚姻。女人对法律给予的保障十分的恐惧,反而喜欢裸奔。 为啥同居就是没有保障的婚姻呢? 因为现行的婚姻法,对女性的约束力几乎没有,写满了对男性的约束力。对男人来说,结婚的性价比太低,不如同居划算。因为结婚了,也不能约束伴侣。反而自己被法律给管辖起来了。 倒不如只同居,不结婚。这样双方都是裸奔,都没有法律保护。那就看谁在...

航天应用下参考系的选取

这俩月,航天的话题比较热。吸引了我的全部注意力。 只是跟着热点跑,那我也就不是我了。 以前高中学习万有引力的时候,从未考虑过的事情,突然变得烦恼起来。那就是,在航天领域,用的是什么坐标系? 火箭要送卫星上天,必须要靠导航。导航导航,导引航迹。必须得知道自己在哪。 知道自己在哪,就必须得描述出来。 在地面上,位置可以用 经纬度+高度 表达。在地面运动的物体,也直接拿地面当惯性参考系。 ...

中国古人的天地宇宙观

在学习世界历史的时候,我知道麦哲伦16世纪完成了环球航行。于是证明了地球是个球。地圆说终于获得实捶证据。从此天圆地方再无市场。 但是,麦哲伦那个时代,一定是对于大地到底是平的还是圆球的,争论不休。也就是说,有相当的一部分人认为,大地是个球。只不过没有实际的证据。 那,这些早就认为大地是球的人,他们的认知来自何方? 这种明显偏离日常经验的知识,必然是源自经年累月的思考和观察。 而且,这样...

物业就是现代版的皇权不下乡

皇权不下乡 在古代,皇权的主要目的就是征税和征兵。而征税是可以“外包”的,征兵后来被“募兵”取代。 于是,维持到村的基层治理体系就变得毫无意义。所谓皇权不下县,就是在县以下的行政单位基本上靠“士绅”自治。 其实古代皇权不下县到明清时代才特别明显。秦汉时期,皇权不仅要下县,还要扎根在村里。 因为秦朝的 “耕战” 制度,全民皆兵。每有战争,皇帝就要派人到村里挨家挨户的征兵。 在工业社会到...

阿波罗载人登月了么

第一次知道载人登月这个事情,是在教科书上。因为是教科书上讲的事情,我对阿波罗载人登月这个事情是深信不疑的。 长大后,随着互联网的普及,开始接触到了老美那边流传的”登月造假“阴谋论。 当然,第一次听到有人说登月是造假的时候,我第一反应是不信(造假)的。 不过,即使不信,我还是会看看他们的理由。 当质疑者提出他们的理由的时候,我的第一反应是,他们说的好有道理,但是肯定背后有一些我不知道的科...

现代婚姻制度错在哪?

古代婚姻制度的基础是家族联姻。现代婚姻制度的基础是“人人平等”。 咋一听,好像进步了。其实不然。准确的说,没有所谓的现代婚姻制度,而是西方的婚姻制度和中国的婚姻制度。大清灭亡后,中国的婚姻制度就没了,被西方婚姻制度取代了。 西方的婚姻制度的第一要义是“算计”。为啥说是算计呢? 因为“人人平等”。以人人平等之名行掠夺之实。结婚双方,一直在算计对方。各种西式鸡汤也不断的提醒你,要“计较”婚姻...

沙雕动画 vs 腾讯动画

很多人说,看国产的动画片,配音不好。然后就跑去看日本片去了。更有奇葩的,要看日语配音的国产动画片。 其实,cv 不专业并不是主要原因。有人说那叫“母语羞涩”,在我看来也不是主要原因。 我认为,根本原因是台词出了问题。 一般人们常把语言分为口语和书面语。 其实,还有一个类型,它既不是口语,也不是书面语,而是专用于台词的语言。 人物的台词,即不能照搬口语使用,也不能直接使用书面用语。 ...

新型单相电机调速器

传统立扇调速方案 传统立扇方案主要采用抽头调速方法,通过机械调速开关改变主绕组与辅助绕组接线方式。一般抽头调速的风扇电机是基于满载工况优化设计,在电机高挡位运转时,绕组磁场接近正交的圆形,噪音和效率表现相对较好,而中低挡位时主绕组和副绕组的结构被改变,绕组合成磁场偏向椭圆,电机运行失去对称性,转矩脉动分量增加。并且中低挡位工况下,运行绕组温升更高,电机偏离了原有优化的状态,其输入功率也没有...

TO-252 对比 TO-220

MOSFET,功率MOS,最常见的外形,就是 TO-252 和 TO-220 两种。 上图左边的为 TO-252 封装。右侧为 TO-220 封装。 其实会发现,TO-220 剪掉中间引脚,折弯两边的引脚,也能转变为贴片形式。 在我设计低压变频器的时候,我一直使用的 TO-252 封装的 MOS。无他,低压的大电流MOS还是TO-252更常见。 后来,设计220v电压的高压变频器...

三电平 SVPWM

炸机了。 制作低压变频器的时候,从未出现过炸机。但是,在高压变频器上,出现了。MOS管直接炸开。pcb铜箔炸飞。 究其原因,还是因为mos关闭时候产生的尖峰电压。 在研究解决方案的时候,碰到了三电平拓扑。 三电平拓扑输出三相电需使用12个 MOS 管。 那么问题来了,12个MOS管,如何控制呢? 其实,不用修改 svpwm 算法。 svpwm 算法在最终,会输出 A B C 三相...