《#诗盗#·一轰领准命消瘦》:冬寒夜冷,飘零一剪胜雪;命峻路险,独饮半升鸡血。卷至无声,生人不易!
注解
改编自霹雳角色“一锋冷峻命萧疏”的诗号。
锋寒心冷,飘零一剑胜雪;
命峻路险,孤愤半生击筑。
筑至无声,今生无敌!
《#诗盗#·一轰领准命消瘦》:冬寒夜冷,飘零一剪胜雪;命峻路险,独饮半升鸡血。卷至无声,生人不易!
改编自霹雳角色“一锋冷峻命萧疏”的诗号。
锋寒心冷,飘零一剑胜雪;
命峻路险,孤愤半生击筑。
筑至无声,今生无敌!
《#诗盗#·疏漏聋锈》:学堂初出欲躺平,技术更迭,规模不减反增。KPI,OKR,内卷岁月财源正盛,共印萧条疑似有染。
改编自霹雳角色“疏楼龙宿”的诗号。
华阳初上鸿门红,疏楼更迭,龙麟不减风采;
紫金箫,白玉琴,宫灯夜明昙华正盛,共饮逍遥一世悠然。
《#诗盗#·天行日月》:白首方知友难交,一意逍遥,钱袋飘飘;十岁春风稣不晓,一心求道,人间邈邈。
改编自霹雳角色“天迹”的诗号。
仙衣眠云碧岚袍,一襟潇洒,两袖飘飘;
玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
《#诗盗#·不算计·咏社》:风雨财源归,挨踢寒冬到。已是高僧绝尘心,犹有一诗骚。骚也不挣钱,只报暖春遥。待到资本卷死时,社在丛中笑。
改编自近代伟人毛泽东的《卜算子·咏梅》。
风雨送春归,飞雪迎春到。已是悬崖百丈冰,犹有花枝俏。
俏也不争春,只把春来报。待到山花烂漫时,她在丛中笑。
高僧绝尘心:当稣有“是非成败转头空,青山依旧在,几度夕阳红。”的领悟和境界时,总有人提醒“你是穷逼”啊。稣内心一骚,总不能暴露稣存款千万的秘密吧!
社在丛中笑:财源是资本主义的报复行为……社会主义接班稣早就看穿这险恶的招数,社会主义必将笑到最后。
《#诗盗#·财源与君》:财源与君君自宽,挨踢翻覆似波澜。白首相知犹内卷,朱门先达笑弹冠。校招全经高薪稀,倒挂欲动冬风寒。绩效浮云何足问?不如卧槽且加班。
改编自唐代诗人王维的《酌酒与裴迪》:
酌酒与君君自宽,人情翻覆似波澜。
白首相知犹按剑,朱门先达笑弹冠。
草色全经细雨湿,花枝欲动春风寒。
世事浮云何足问,不如高卧且加餐。
朱门:这里特指资本家。
高薪稀:每年校招工资上限都提高,而且大肆宣传,但其实都是一个广撒网的套路,一段时间后,公司发现新人能力不够时,很容易被裁掉。高回报高风险。
卧槽:卧在一个槽里,与“跳槽”相对。
《#诗盗#·咏鹅》:鹅,鹅,鹅,企鹅最快乐。摆渡无道德,阿理不姓社。
《#诗盗#·颛顼死即复稣》:悠悠世道,碌碌仙术。唯寂乃明,临绝复稣。
唯寂乃明:空寂顿悟,我即是佛。
临绝复稣:绝地重生。
《#诗盗#·真空涨落出一个元宇宙》:稣学宇宙非学仙,恐君此说是虚传。山海不是稣归处,归即应归有顶天。
改编自唐代诗人白居易的《答客说》:
吾学空门非学仙,恐君此说是虚传。
海山不是我归处,归即应归兜率天。
多现代?C++ 11 就有了。
我想返回一个对象,但我受到惊吓……
是不是应该从指针型参数返回对象?
已经 C++20 了,请放心,直接,返回对象!
RVO:Return Value Optimization,返回值优化。
NRVO:Named RVO,具名的返回值优化。
返回的对象会 move 给接收的变量,并且,最多可能优化成直接对接收变量进行构造(NRVO)。
如果明确没有 move 构造函数,则会调用 copy 构造函数,当对象构造代价高时,应该尽量保证有 move 构造函数。
1 | // 传统,不建议,可读性差,使用也不方便 |
没有必要对返回值再加一次 std::move,因为返回本身就已经是 move,再加一次就是多一次没必要的 move。
多现代?C++ 20。
C++ 17 才有 std::string_view
,而相似的 std::span
居然到 C++ 20 才有。
如何解决 C-Style 数组(包含动态分配的连续内存)的退化(array decay)和越界访问(range errors)两大问题?
C 语言解决这两个问题,主要是增加一个长度参数。很多 Win32 API 这样做,例如:
1 | PCSTR WSAAPI inet_ntop( |
但它会带来新问题:不小心传错!另外也有一些地方并没有提供长度参数,比如下面 Linux 内核代码里的函数:
1 | static inline int ip_decrease_ttl(struct iphdr *iph); |
当我们打算把 uint8_t 数组转成 struct iphdr *
时,必须在调用前保证数组长度大于等于最小 IP 头长度。
C++ 的解决方案是:std::span
,它是一个连续对象存储的观察者。类似 std::string_view
是 std::string
的观察者。它可以同时管理数组的地址和大小,并且它没有数据所有权,仅占用最多两个指针的空间,可以像 std::string_view
一样在绝大多数时候直接按值传递。
以下函数用于获取 IP 头的长度:
1 | std::uint8_t GetHeaderLength(const void* ip_header, size_t size) noexcept; |
它可以用 std::span
包装成:
1 | template <typename T, size_t N> |
另一个便利是,使用 subspan 成员函数可以对其内部指针和长度成对操作,以避免单独处理时可能不小心少处理一个的问题。
std::span
和 std::string_view
一样,没有数据所有权,所以要担心数据失效问题,不要在数据被释放后使用。
下面是个错误示范,来自:std::string_view encourages use-after-free; the Core Guidelines Checker doesn’t complain #1038
1 |
|