Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.
Get Feedercyhone.com
Get the latest updates from 沉思录 directly as they happen.
Follow now 32 followers
Last updated 6 months ago
6 months ago
C++17 中引入了 std::any,可以非常方便地将任意类型的变量放到其中,做到安全的类型擦除。然而万物皆有代价,这种灵活性背后必然伴随着性能取舍。std::any 的实现本身也并不复杂,本文将基于 libstd++ 标准库源码 深入解析其实现机制与性能开销。 底层存储std::any 需要解决的核心问题在于:异构数据存储:如何统一管理不同尺寸的对象类型安全访问:如何在擦除类型信息后仍能提供安全的类型查询。例如可以直接通过 std::any 提供的 type()...
8 months ago
我们在使用C++的时候,有时会需要在类的内部获取自身的shared_ptr,这就会用到 std::enable_shared_from_this。在实际使用过程中,std::enable_shared_from_this有三个陷阱需要注意: 不能在构造函数中使用shared_from_this(), 否则会抛出std::bad_weak_ptr异常。对应下面情况1。 创建的对象必须由shared_ptr管理,shared_from_this()才能生效,否则也会报std::bad_weak_ptr异常。对应下面情况2。 对应类必须public继承std::enable_shared_from_this,不能是protected或private继承,否则也会报std::bad_weak_ptr异常。 以上case均可以通过wandbox复现。 那么为什么会有这些限制呢?本文将从std::enable_shared_from_this的源码角度解读其原因。本文解读的是clang libc++的实现,代码地址:shared_ptr.h#L1433
over 1 year ago
我们有这么一段业务代码,在 Gin 的 API Handler 中,开了一个子 goroutine 写 DB,代码大概是这样:package mainimport ( "github.com/gin-gonic/gin"...
about 4 years ago
本文属于 《Golang 源码剖析系列》sync.Pool 是 Golang 内置的对象池技术,可用于缓存临时对象,避免因频繁建立临时对象所带来的消耗以及对 GC 造成的压力。在许多知名的开源库中,都可以看到 sync.Pool 的大量使用。例如,HTTP 框架 Gin...
about 4 years ago
问题是这样的:我在代码里面调用了 os.Chmod("test.txt", 777),希望把该文件的读写及执行权限对所有用户开放。执行完代码,顺手 ls 看了下。如下:$ ls -l test.txt-r----x--x 1 cyhone 1085706827 0...
about 4 years ago
我们在开发 HTTP Server 的时候,经常有对接口内容做缓存的需求。例如,对于某些热点内容,我们希望做 1 分钟内的缓存。短期内缓存相同内容不会对业务造成实质影响,同时也会降低系统的整体负载。有时我们需要把缓存逻辑放在 Server 内部,而非网关侧如 Nginx 等,是因为这样我们可以根据需要便捷地清除缓存,或者可以使用 Redis 等其他存储介质作为缓存后端。这样的缓存场景无非是有缓存时从缓存取,无缓存时从下游服务取,并将数据放入缓存中。这其实是个非常通用的逻辑,应该可以将其抽象出来。从而缓存逻辑无需进侵入业务代码。我常用的...