自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

fpcc的专栏

于细微处见精神,从宏观里学态度。行之苟有恒,久久自芬芳。

  • 博客(583)
  • 资源 (21)
  • 问答 (1)
  • 收藏
  • 关注

原创 c++应用网络编程之五Windows常用的网络IO模型

在Windows平台上,网络高并发的开发,重点以游戏居多。其它的当然也可以做,毕竟IOCP可不是白给的。其实游戏行业是一个非常好的方向,开发者如果有兴趣的话可以深入的学习研究。当人们吃饱饭的时候儿,精神食粮就提到了必须的日程上来。至于游戏对青少年的影响,就看大环境了。已经好多年不在Windows上进行编程了,以后的网络编程重要分析也是以类Linux平台为主。

2024-07-21 13:02:43 404 1

原创 c++应用网络编程之四Linux常用的网络IO模型

实事求是,与时俱进,理论联系实际,实践是检验真理的唯一标准…,这些理论每个人可能都会脱口而出。但真正的应用环节呢?可能绝大多数人会有意无意的找各种借口,陈陈相因,因循守旧,更别提创新意识了。只有在实践中深入分析掌握了现有技术的优劣,才可能知晓应用场景下的各种技术不足,才可能产生创新意识。网络编程中这种例子特别多(如io_uring,dpdk),毕竟实际应用的在不断提高对网络技术的要求。而更可怕的是,这种要求不但没有降低还在不断的提高。

2024-07-20 10:49:21 475 1

原创 跟我学C++中级篇——虚函数的性能

学习知识不是简单的为了会用,而是能够灵活的运用。要想灵活的运用,则必须掌握技术本质的内涵。只有把其内在体系掌握,才能在具体的场景上发挥其优势。这也是总说的从必然世界到自由世界的一个哲学问题。

2024-07-19 21:43:46 877 2

原创 c++应用网络编程之三用户态和内核态

计算机初始是没有什么用户空间内核空间之说的。这两个是从有了OS之后才出现的。这两个概念本来属于操作系统的相关概念,为什么拿到网络编程之中进行介绍呢?最主要的原因在于,网络编程是少有几个在开发者中经常遇到用户态和内核态显示交互的场景。那么为什么会有用户空间和内核空间的划分呢?也很简单。首先弄明白一件事,编程的主要目的是什么?是通过控制计算机的CPU来处理各种IO或相关操作来达到某种需求。而实际情况是,不管是CPU还是各种硬件或者IO操作等,其具有相当的专业性和复杂性,这就无形中为编程处理立起了一道无形墙。

2024-07-14 08:46:25 650 2

原创 跟我学C++中级篇——常见的错误问题分析

无论是菜鸟还是老鸟,在写C++代码时(也包括C中的部分),往往会犯一些常见的错误,可能这个错误回过头来看不算什么,但却经常让开发者忽视或者说忘记。这些问题大多都不是多么高深伯问题,修改后让人大呼真是大意了。很多问题,在前面的文章中都说明或者分析过,可能没有引起大家的重视,本文将其大略总结一下,以咨为正。主要是总结常见问题或者说一些容易忽视的问题,所以对复杂和不太常见的就不提了。C++学习曲线比较陡峭,之所以想总结一下这些常见问题,就是给入门和初中级开发者一个借鉴。

2024-07-13 08:24:36 293 2

原创 并行编程实战——TBB编程流图的问题

有时间应该看看TBB的底层源码。其实可能看到源码,瞬间就明白了原因,可是现在只是上层应用,那么就只能靠经验和文档来处理类似的问题了。框架的运用,其实重点在于明白其内在的运行逻辑和控制流程,再加以代码辅助,文档说明,这是最佳的打手伴侣。

2024-07-12 22:10:10 826 1

原创 对编程开发人员在今年的一些建议

人生就是这样,我们经历了四十年蓬勃向上的快速发展,让很多人误以为奋斗是可以改变命运。这句话其实不完全对,真正改变命运的是奋斗和机遇。可这四十年,是有历史以来,最为机会丰富和频出的时代。可以这样说,机会才能使奋斗转变为真正的命运改变。纵览历史,这段时间是一个历史的偶然时代而非常态,所以需要后来者放平心态,不辍努力,但也要睁大眼睛,去发现并千方百计的抓住那愈来愈少的机会。读书可以改变命运,学历决定未来的往昔,已经如烟一样的开始幻灭!

2024-07-07 12:24:26 612 2

原创 c++应用网络编程之二网络的IO模型

网络服务端编程是复杂的,要先从宏观上把网络通信的相关机制搞清楚。这样才能更好的在开发过程中明白一些细节的掌控,而不至于迷失在细节当中。这个系列会从顶层一点点的抽丝剥茧的把相关背景和技术栈分析展开,并对它们的相对关系进行分析说明。某些具体的细节如果不必要就不展开了,请大家自行查阅相关书籍或者资料。

2024-07-06 10:52:02 878 1

原创 c++应用网络编程之一基本介绍

c++编程的应用场景在前面分析过,一个重要的方向就是网络编程。一般来说,开发者说的服务端编程在c++方向上简单的可以认为是网络编程。首先需要说明的,本系列不对网络编程的相关基础知识展开详细的说明,因为这种知识在书本上太多了。网络上各种资料更是满开飞,没有必要拷贝来拷贝去的。特别是一些协议等的解析说明,如果不遇到特定的问题不会深入分析说明。那么最应该明白的网络编程是什么?那么就得明白网络是如何而来。网络,从名字上很好理解,一张把“经络”连接起来的大网。

2024-06-30 11:10:36 674 3

原创 BASH and SH in SHELL scripts

脚本用处真得很大,尤其在一些监控、测试的情况下,一个简单的小脚本就可以达到控制程序的目的。特别是粘连一些相关工具如Jenkins和部署时,可以极大的减少代码的工作量并迅速构建迅速部署。当然脚本的缺点也不少,最显著的就是不好调试,对一些复杂的函数和变量往往需要死记硬背。建议大家都要好好学习一下脚本相关的知识,这样在服务端开发中,会大提高工作效率。原来总以为脚本是运维的事儿,后来才发现大谬。好好学习,犹未晚尔!

2024-06-29 09:01:49 757 1

原创 网络编程之XDP、TC和IO_URING以及DPDK

学习理论知识十分的枯燥,特别对工作后的人,不论是从记忆力还是注意力,已经从单纯的学习转向了为了生活而打拼。此时对一些理论性的东西往往感到没有什么意义。但还是需要强调的是,计算机技术是一门非常强的理论和实践高度结合的技术学科。理论和实践缺一不可,新技术的突破往往是开发应用瓶颈的突破口,不需要到处再打补丁;同样,丰富的实践场景可以推动技术的完善和创新。思维不要僵化,要与时俱进。

2024-06-23 09:31:47 569 2

原创 网络编程之XDP技术的基础eBPF

eBPF的发展史,就是一部需求推进的发展史。所以说,技术不落地,发展的速度就会受限。反过来,强劲的落地需求,推动着技术不断的完善和快速发展。学习也是如此,如果只是为了学习新技术而学习,无法在实际工作中应用,那么技术学习了往往也会被忘记。而如果在实际的场景中应用到,那么对技术的理解会越来越深越来越通晓。这样,在后面的工作中会应用的如鱼得水。甚至有可能反过来,深入技术内部进行完善和修改。

2024-06-22 11:04:01 1066 1

原创 一步一步写线程之十五协程

人难得是选择,选择是最痛苦的。但一旦选择完成,朝着方向前进,其实反而没有什么可痛苦的了。今天讲协程,没有继续于以往的技术实现的原理和实现的框架或者应用的方法,而是从另外一个角度分析其在计算机发展过程上的定位。言简意浅,与诸君共勉!

2024-06-16 14:43:36 602

原创 网络编程之XDP和TC

创新是技术的灵魂。不断重复的技术其实就是一种落后的表现。做为一个开发者,加入创新技术的大军可能是很小概率的事件,但不代表对新技术的不敏感。对于开发者来说,新技术的优秀重点在于落地。不能落地的新技术,还不如老的技术。

2024-06-15 12:10:51 735 2

原创 c++工程实践——实际工程中的文件读取和日期处理的小问题

万丈高楼平地起,基础的重要性已经反复说得都麻了。但不得不说,往往都明白基础的重要性,可其实并未真正时刻挂在心上。上面的例子就说明了学习态度中的一些瑕疵,与诸君共同努力改正吧。

2024-06-14 21:56:58 345 1

原创 网络编程之XDP技术应用

在上文中介绍了XDP技术,XDP技术的基本原理已经明白,但有一个问题,一个技术如何落地,如何在实际中应用?这就需要有一个承载其的具体的形式。举一个例子,网络编程一般使用Socket方式,那么能不能够在这种方式里使用XDP技术呢?答案是肯定的。Linux在内核中提供了AF_XDP套接字编程,这就意味着,大部分的编程方式仍然可以以原来的套接字编程为主。这样的好处显而易见,对开发者和维护者来说,都是相对要容易理解和支持。AF_XDP类似于AF_NET(TCP/IP等)等一样,是一个协议族,大家有没有记得在TCP

2024-06-10 11:00:45 935 2

原创 跟我学c++高级篇——技术进步对开发演进的影响

与时俱进,不断用发展的眼光看待和解决问题。掌握技术发展的规律并不断的跟进,有可能的话甚至参与到技术的创新中去,这才是一个开发者应该具备的基本认知。其实无论任何技术都是如此,最终发展成为一个哲学问题。与诸君共勉!

2024-06-09 18:38:11 964 1

原创 网络编程之XDP技术介绍

XDP:eXpress Data Path,快速数据面,听名字是不是很高大上。其实它就是一个快速处理Rx数据包的数据面技术。为什么现在对数据处理如此敏感?原因非常简单,随着网络的不断覆盖社会的各个层面,海量的数据不断出现,而处理这些数据就要求一个字,快。无论是Linux亦或是Windows,它们都产生于早期的计算机系统,对快速的网络数据处理,大多天生就带有一些不足,这也导致了很多的问题。一般来说,操作系统的特点就是要有相当大的通用性,而这种通用性往往也是性能的瓶颈,这个瓶颈自然也包括网络数据通信。

2024-06-08 13:54:55 843 1

原创 跟我学C++高级篇——回调函数及应用

之所以把回调函数放到高级篇,不是说回调函数本身有多么高级而是回调函数的应用是非常灵活的,用得精妙之处,完全可以放到高级的应用中。一个简单的回调函数,最大的优势是可控和安全。但回调函数不是没病的山梨儿,大家还是要斟酌考虑,不要滥用。

2024-06-07 23:47:58 930 1

原创 c++外部模板

模板的优势估计很多人都知道,但是模板的劣势也有不少,其中,代码膨胀就是其中之一(其它还有不易理解、不易调试等)。上面的示例代码非常简单,但可以说明一个问题,在上一篇中提到过,c++的编译是以CPP为单元进行的,模板如果不使用就不会生成代码,那么如果在两个CPP文件中使用一样的数据类型会产生什么样的情况呢?比如上在这种情形,都是int类型,只是数据略有不同。答案是编译器肯定会生成两个完全相同的函数。

2024-06-05 17:42:44 375 1

原创 一步一步写线程之十四并行编程和并行库

古人说:“工欲善其事,必先利其器”,牛顿说要站在巨人的肩膀上,道理都是想通的。程序的设计开发也是如此,前人做过了很多非常有益的工作,后来者不必非再重复造一个轮子。但说这话得有一个前提,你得知道怎么造轮子,并且明白其内部的猫腻。学以致用,用而后思。不断总结推进自己的编程水平和提高自己的编程思想,这才是王道。并行编程并不是本系列文章的目的,这里把并行编程的相关进行基础的分析介绍,主要目的是让开发者明白,所谓并行框架的基石,仍然是多线(进)程编程。

2024-06-02 09:01:56 770 1

原创 一步一步写线程之十三队列间的消息通知

其实队列的处理,不光有这种细节需要处理,包括内存大小的处理,是否提前处理,都是需要考虑的。正如前面所说,一个队列的设计,不仅仅是一个算法的问题,可能涉及到很多的技术知识和相关的难点。如何能够综合运用这些知识适配开发场景,就是对设计师的一个考验了。

2024-06-01 08:19:11 454 1

原创 跟我学C++中级篇——if constexpr的应用

要关于对老的知识点的综合应用并不断的总结这种用法的可用之处,从而不断的推导出问题的解决办法。再通过这种解决办法可以看新的标准中是否有类似的更方便的方法,就可以更好的理解和认知一些技术点。可上层的给定的缓冲区内的数据类型确实是可变的,做为一个中间处理层,如何能够正确的引导程序自动适配准确的函数调用呢?本来这个非常简单,只要定义一个模板即可搞定,但这里偏偏有一个细节,是调用别人的库来实现写入。而这个库对不同的数据类型的写入,提供了N种不同的函数,这些函数只是名字和写入数据类型不同,其它都完全一样。

2024-05-31 21:53:18 460

原创 跟我学C++中级篇——内存屏障内存栅栏和编译器屏障以及相关

有锁和无锁就如武学上的有剑和无剑,重要的不是剑,是一种对内存原理的根本性的理解。不要对一些技术奉为圭臬,因为每一种技术一定有它的长处和短处。也就是常说的应用场景,只有会灵活运用,才是自由的编程。

2024-05-26 08:25:33 632 1

原创 一步一步写线程之十二无锁编程

这里需要声明一个问题,就是在生产者消费者绝对不对等的情况下,使用何种算法和技巧都是没有办法解决问题的。这句话是什么意思呢?就是说十个人干得活,如果只有一个小孩来干,用什么方法在当前状态下也是无解的。但如果合理的采用一些调度算法,安排一下流程,可能五个人就可以完成十个人的工作量。这是不是有点象武学上的“一力降十会”?同样,无锁队列的目的是提高效率,而不是从解决不可能解决的问题。大家千万不要走进误区,切记!

2024-05-25 10:25:12 339 1

原创 跟我学C++中级篇——字符串的转化

上面只是把常见的一些转化分析说明了一下,其实在不同的环境下,还有很多方法可以进行转换,比如使用字符一个个的处理来进行自定义,使用一些特定的函数(如各种库或框架的函数)等等。大家可以根据自己的实际情况来进行应用,不必拘泥于某种实现。但是需要引起注意的是,简单的方法往往不普遍适用,导致异常;普遍的方法往往不方便。鱼和熊掌不可得兼,请大家根据自己的场景来决定应用的方式。unicode编码相关等以后有机会再总结分析!

2024-05-19 11:33:08 559 1

原创 跟我学C++中级篇——字面量和字符串

其实从本文的分析就可以看出,标准的进步对编程还是非常有好处的。至少,可以减轻编译的复杂度。特别是在一些看起来不太起眼的地方,更是让开发者省心。所以,还是要与时俱进,拥抱变化。

2024-05-18 11:37:42 475

原创 跟我学C++中级篇——POD数据类型及演进

现在都知道数据是资产了,数据的定义就有数据类型,可以看这几种类型当成一种更抽象的层次的数据类型。怎么理解这句话呢?可以把常见的各种语言中的数据类型定义(如int,float等 )当成普通数据类型,而上面分析的数据类型理解为这些数据类型以上的更高层次的抽象。只要满足了特定的要求,就可以将其理解为这种数据类型。绕来绕去,真麻烦。这些数据类型有什么 用处呢?其实是兼容扩展,能够和其它语言保持数据交互,这其实是相当重要的。沟通几乎能治百病,慢慢理解。

2024-05-12 10:52:43 372 1

原创 跟我学C++中级篇——封装对象的实践

面向对象编程是一种非常广泛的编译方式,很多开发者可能对它是既了解又不了解。对一些基础的知识会用,但又不知道是否用得合适,能不能有一个标准来判定。其实这恰恰表明对面向对象编程还是掌握的不够深入。一切设计没有标准只有原则,这也意味着,实际场景下,在考虑原则的同时,更要考虑实际的需求进行适当的取舍。最好的设计方法是没有的,只有最合适的设计方法。

2024-05-11 21:25:30 580 4

原创 跟我学C++中级篇——内联补遗

许多的技术看起来很简单,用起来也没有什么可以体察到困难的地方。比如这个inline,反正写不写以后编译器还要看自己心情来处理。但其实真正的向内部观察其原理,会发现有很多技术点在等着你去融会贯通。可以把inline的函数和变量通过汇编去深入分析一下,再查看一下它的具体的实现和优化的过程,好多细节的明白,会是开发者提升自己能力的一个重要的契机!

2024-05-11 21:20:59 496

原创 跟我学C++中级篇——const和constexpr的使用

要善于分析和总结学到的知识,要不断的回望自己学习的成果并加以整理分析。每一个简单的进步,其实都是思想上的一次升华,量变到质变,最终产生一次飞跃。古话说得好“勿以善小而不为”。

2024-05-04 14:37:16 409 1

原创 一步一步写线程之十一线程池应用内存池

可能有的同学说这个和在网上或者书上看到的内存池不大一样啊?其实本质是一样的。直接分配内存控制比特流,然后再分块拆分和上面的直接进行对象分配本质是相同的,不同的在于可能直接使用比特流会更灵活。或者说把本文叫做对象池,可能就更容易理解了。这一篇只是针对线程池中的内存池应用进行一个基础的分析说明,后面会抽时间对内存池有一个全面的分析说明。诸如内存池的大小分组(微型、小型、中型、大型)和是否连续处置(内存一次分配,分块使用)等,本文都没有涉及,目的只是一个很简单的在线程池中使用内存池,知其所以然即可。

2024-05-03 18:22:44 353 2

原创 跟我学C++高级篇——名称反射创建对象的一种实现的说明

这个怪偷懒的精神做祟,说明一下就好了。这也说明,对细节的说明一定要清晰严谨,不能想当然的别人也会这么理解。沟通的成本,就是这样产生的。

2024-05-02 10:26:12 271 2

原创 跟我学C++中级篇——零长度数组

其实零长度数组是一个技巧,这样的小技巧在C/C++中有很多。它们在一些特定的场景下有着非常好的应用,不过前面的定语一定要记清楚,特定的场景。这也是C/C++让初学者感到难缠的一个重要原因。到处都有一些特殊情况,而特殊情况里可能又套着特殊情况。这种小技巧的东西,不用刻意学习,用到了,想起来有,查查资料用就可以了。

2024-05-01 17:03:26 484 1

原创 跟我学C++中级篇——内联

内联的优势其实可以分成两个部分,一个是调用方面的,比如前面说的出栈入栈等;另外一个是调用时的优化,比如函数代码如果成为内联函数,编译就可以把一些类似的固定计算直接指定为计算的结果值。而内联的劣势,主要就在于内联导致的代码膨胀,而有些时候过度内联反而会导致性能的丧失。明白了内联的优缺点,就可以根据自己的实际开发需求来进行使用了。整体上而言,内联函数适合于小型、高频函数的调用,通常可以在ORM的数据库属性读写中看到。

2024-04-30 22:02:56 671

原创 架构设计杂谈

架构设计和思想这些东西,是非常不愿意谈的。一个是网上和实际的书本上资料太多;而另外一个就是,这些东西是需要大量的编程实践来支撑的(这也意味着不同的环境发展可能产生不同思想体系)。换句话说,对一个没有任何编程经验或者说编程经验少得可怜的人来说,谈这些根本没有任何意义。那么有人说,我好好的编程,搞这个十几年,不就有了架构和设计的思想体系了么?大错。编程经验是架构设计的一个必要条件而已。大家都明白道理,但是一真正涉及到自己,就拎不清楚了。

2024-04-27 10:46:23 494 2

原创 一步一步写线程之十memory_order的应用

通过上述的分析和例程测试,可以清理的明白内存模型中内存顺序的意义。通过定义指定的内存序,可以防止编译器的一些特定的操作(指令重排和可见性等),也可以理解为,从标准上屏蔽了对编译器的额外的处理,使得数据在不同平台的不同线程中,只在语言层面就可以控制内存的数据交互。控制层面向高层发展的结果就是,降低了开发者和设计者的负担,能够更安全的进行多线程的数据编程。

2024-04-26 21:58:38 706 4

原创 跟我学C++中级篇——临时对象

如果工程对效率要求不高,其实对临时对象的处理也不用费什么心思。赶哪的集用哪的斗,不用刻意非得怎么着才行。主打一个兼顾效率和开发的平衡,优化未必时时都是一个必选项。

2024-04-26 21:11:23 354

原创 跟我学C++高级篇——名称反射创建对象的一种实现

在后期的文章和实例中,大家会发现,会越来越多的把前面的知识融汇贯通,有可能再加上一些新知识点,就会实现一个比较好的技术点。所有的技术应用,一定是在基础技术上的不断的抽象升华。一种完全全新的,不以前边的技术为基础的技术,几乎很难遇到。或者如此说,即使遇到了,也可以通过老的技术快速的体会到新技术的优缺点。但这有一个前提,思想必须永远是开放包容,与时俱进!

2024-04-21 12:18:06 513 2

原创 一步一步写线程之九线程池任务的窃取

对绝大多数软件人员而言,其实很多技术拼到最后不是拼设计者的聪明才智,拼的是经验。特别是对于工程类的开发更是如此。而软件开发领域,基本以现有的成熟的技术为主,这点就更突出。随着软件的规模越大,经验的要求越高。很多开发者可能终其一生都遇不到所谓的千万并发,那希望他设计一个支持千万并发的服务,就是一个不可能的任务,其它情况亦是如此。所以开发者们勿需气馁,把基础打好,认真学习,找机会就上。不断总结经验得失,技术就会越来越磨炼得精粹。

2024-04-20 10:23:28 642 1

linux设备驱动开发

本书从浅到深介绍了LINUX操作系统上的驱动开发的过程,值得推荐。

2018-11-17

masstree算法论文

目前的底层的分布式数据库如ROCKSDB等都使用的LSM的算法,本文使用了masstree这种算法来优化其处理。

2018-11-17

虹膜开源的算法

本文是国外的一款开源的虹膜识别框架的介绍,它的源码是可以直接使用的,但是需要优化。

2018-11-17

mixin白皮书

mixin是一个闪电交易快速的点点对的数字交道项目,它拥有非常好的技术栈。

2018-10-11

steamr白皮书

steamr是一个用来做数据去中心化的网络和市场相关的区块链项目,主要提供去中心化的云服务。

2018-10-11

阿希链白皮书

阿希链是一个用javascript写的侧链,主要用来完成多链间的通信,有一定的特色,可以借鉴。

2018-10-11

大数阶乘算法的一个例子

小数的阶乘比较好做,但是阶乘的数量变化非常快,很快会溢出,这里采用一种变通的方法,可以实现相当大的数的阶乘,如果在这个基础上进一步扩展,能进行更大的阶乘算法。

2018-10-06

电能质量闪变的测量

电能质量是电力行业一个重要的部分,本论文从实际出发,论证了闪变测量的方法。

2018-10-05

安卓编译JAR包和SO

这个是用ECLIPSE编译JAR包和SO的一个教学录像,非常适合对c++不熟悉的人编译使用。

2018-10-01

JAVA并发编程设计原则与模式

一本比较老的书,讲得多线程和并发技术,是一个入门的比较浅显的书籍。

2018-10-01

代码管理核心技术及实践

代码管理是开发过程一个重要的环节,好的代码管理可以为团队的开发提供安全的保护和合作,本书就是讲述在不同环境中如何使用主流的代码管理软件和方式。

2018-09-30

IOTEX白皮书

物联网和区块链的结合,实现了链中链和跨链的通信,通过特有零知识证明来解决用户隐私问题。

2018-09-30

bancor协议白皮书

bancor协议是目前区块链研究的一个重要方向,跨链不同的TOKEN之间的兑换一直是一个问题,这里给出一个解决的方案。

2018-09-29

以太坊上PBFT的实现

针对以太坊的POW算法的一种改进方式,引入了PBFT的算法,论文主要从原理上阐述了实现的过程。

2018-09-29

DERP白皮书

DREP区块的白皮书,是一个新的区块链的技术,如果大家对这个感兴趣,可以下来看看。

2018-09-29

朗新WEBSERVER接口(南网和天津电网)

适用于朗新目前的所有接口,平台语言C#,主要是对电力系统SG186的跨平台调用。也适于于同样的WEBSERVER工程跨平台使用。使用说明书已打在压缩包里。

2009-03-16

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除