第 78 期:21 天效应
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
@Author : Lewis Tian (taseikyo@gmail.com)
@Link : github.com/taseikyo
@Range : 2024-09-01 - 2024-09-07
| |
本文总字数 8041 个,阅读时长约:12 分 36 秒,统计数据来自:。
C++ 模板的偏特化与全特化
C++ 模板的偏特化与全特化
C++ 学习 __attribute__((packed))
的作用
红叶书斋小说下载
21 天效应
模板机制为 C++ 提供了泛型编程的方式,在减少代码冗余的同时仍然可以提供类型安全。特化必须在同一命名空间下进行,可以特化类模板也可以特化函数模板,但类模板可以偏特化和全特化,而函数模板只能全特化。 模板实例化时会优先匹配"模板参数"最相符的那个特化版本。
1、模板的声明
2、全特化
通过全特化一个模板,可以对一个特定参数集合自定义当前模板,类模板和函数模板都可以全特化。 全特化的模板参数列表应当是空的,并且应当给出"模板实参"列表:
注意类模板的全特化时在类名后给出了"模板实参",但函数模板的函数名后没有给出"模板实参"。 这是因为编译器根据 int max(const int, const int)
的函数签名可以推导出来它是 T max(const T, const T)
的特化。
3、特化的歧义
上述函数模板不需指定"模板实参"是因为编译器可以通过函数签名来推导,但有时这一过程是有歧义的:
此时编译器不知道 f()
是从 f<T>()
特化来的,编译时会有错误:
这时我们便需要显式指定"模板实参":
4、偏特化
类似于全特化,偏特化也是为了给自定义一个参数集合的模板,但偏特化后的模板需要进一步的实例化才能形成确定的签名。 值得注意的是函数模板不允许偏特化,这一点在 Effective C++: Item 25 中有更详细的讨论。 偏特化也是以 template 来声明的,需要给出剩余的"模板形参"和必要的"模板实参"。例如:
函数模板是不允许偏特化的,下面的声明会编译错:
但函数允许重载,声明另一个函数模板即可替代偏特化的需要:
多数情况下函数模板重载就可以完成函数偏特化的需要,一个例外便是 std 命名空间。 std 是一个特殊的命名空间,用户可以特化其中的模板,但不允许添加模板(其实任何内容都是禁止添加的)。 因此在 std 中添加重载函数是不允许的,在 Effective C++: Item 25 中给出了一个更详细的案例。
模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类:
函数模版
类模版
模板定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进 行编译。用户提供不同的类型参数,就会实例化出不同的代码。
1、类模板
类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。类模板尤其适用于描述通用但类型安全的数据结构。
类模板使用:
类模板全特化:限定死模板实现的具体类型;
比如上述这个例子,我们比较 int 类型这种还可以,但是比较 float 这种类型就不行,这时候就需要进行模板特化;
类模板偏特化:指提供另一份 template 定义式,而其本身仍为 templatized,这是针对于 template 参数更进一步的条件限制所设计出来的一个特化版本。也就是如果这个模板有多个类型,那么只限定其中的一部分;
2、函数模板
函数模板一般定义:
函数模板特化和类模板特化本质是一样的,是对模板参数的特殊化处理:
总结
函数模板只有特化,没有偏特化;
模板、模板的特化和模板的偏特化都存在的情况下,编译器在编译阶段进行匹配,优先特殊的;
模板函数不能是虚函数;因为每个包含虚函数的类具有一个 virtual table, 包含该类的所有虚函数的地址,因此 vtable 的大小是确定的。模板只有被使用时才会被实例化,将其声明为虚函数会使 vtable 的大小不确定。所以,成员函数模板不能为虚函数。
最近在看我们的代码的时候发现声明类型的时候有 __attribute__((packed))
的结构体类型声明,如下:
不知道是什么意思,查了下知道是如下含义:
__attribute__((packed))
的作用就是告诉编译器,取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是 GCC 特有的语法。这个功能是跟操作系统没关系,跟编译器有关,GCC 编译器不是紧凑模式的。在 windows 下用 vc 的编译器也不是紧凑的,用 tc 的编译器就是紧凑的。例如:
在 TC 下:struct my{char ch; int a;} sizeof(int)=2;sizeof(my)=3;
(紧凑模式)
在 GCC 下:struct my{char ch; int a;} sizeof(int)=4;sizeof(my)=8;
(非紧凑模式)
在 GCC 下:struct my{char ch; int a;}__attrubte__((packed)) sizeof(int)=4;sizeof(my)=5
__attribute__
关键字主要是用来在函数或数据声明中设置其属性。给函数赋给属性的主要目的在于让编译器进行优化。函数声明中的 __attribute__((packed))
,就是告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码。
GNU C 的一大特色就是 __attribute__
机制。__attribute__
可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
串行下载(parse_series),入参是首章的链接,保存每章小说到 text 目录下。这是第一波试水的,执行流程是基于当前章节的链接获取本章节的文本以及下一章的链接,然后一路爬下去,效率较低。
并行下载(parse_parallel),入参是小说 ID,保存每章小说到此 ID 目录下。主要流程是从小说的首页章节目录表获取所有章节的链接,然后基于设定的 THREAD_COUNT 去并发下载。
1、什么是 21 天效应
在行为心理学中,人们把一个人的新习惯或新理念的形成并得以巩固至少需要21天的现象,称之为21天效应。也就是说,一个人的动作或想法,如果重复21天就会变成一个习惯性的动作或想法。
根据我国成功学专家易发久研究,习惯的形成大致分为三个阶段:
第一阶段:1-7天左右。此阶段表现为“刻意,不自然”,需要十分刻意地提醒自己。
第二阶段:7-21天左右。此阶段表现为“刻意,自然”,但还需要意识控制。
第三阶段:21-90天左右。此阶段表现为“不经意,自然”,无需意识控制。
2、21 天效应的产生原因
为什么会发生21天效应呢?其主要原因是什么?影响它的因素有哪些?据研究发现,影响21天效应的主要因素有如下方面:
一是旧习惯、旧理念对新习惯、新理念形成的干扰。当两种习惯、理念在形式上有很大的相似性,但其中某些因素都要求相反的内容时,就会发生干扰。例如教书育人与导学育人两者具有很大的相似性,都是要求教师做出育人的理念与行为,但教书与导学的育人手段有较大差异,甚至有本质差异,因此,要形成导学育人的新理念与习惯常会受到教书育人的影响和干扰。实践表明,旧习惯、旧理念越是巩固,新习惯、新理念的形成就越容易受到干扰。因此,在旧习惯、旧理念干扰下学习一种新习惯或新理念,就会时常出现某些顽固性的错误。这些错误来自旧习惯、旧理念中的成分。可见,一个新理念或新习惯的形成需要21天(或重复21次),是与旧习惯、旧理念的干扰有密切关系的,这也可以说是产生21天效应的主要影响因素。
二是理念与习惯的形成需要一个过程。这一点前面已经谈及,据易发久的研究,它需要三个阶段才能形成。如用美国凯尔曼(1961)的研究,它也需经三个阶段,第一阶段,顺从。即表面接纳新理念、或开始新习惯,在外显行为上表现出尽量与新的要求一样,而在实质上未发生任何变化。此时,最易受到外部奖励和惩罚的影响,因为顺从可获得奖励,不顺从就会遭到惩罚。可见,新理念、新习惯的形成一开始多数是受到外在压力影响而产生的,自发的是极为少见的。第二阶段,认同。认同是在心理中主动接纳新理念、新习惯的影响,比顺从更深入一层,因此,此时意识成分更加浓厚,不再是被动的无奈的,而是主动地、有意识地加以变化,使自己尽可能接近新理念、新习惯。第三阶段,内化。此时新理念、新习惯已完全融于自身之中,无任何不适之处,已彻底发挥新理念、新习惯的作用。一般而言,这三个阶段对非特异的理念、习惯只需21天便可形成,这是大量实验与实践的结果。
三是新理念、新习惯的形成需要不断地重复,即使简单的不断重复也是十分有效的。 21 天效应不是说,一个新理念、新习惯只要经过 21 天便可形成,而是21天中这一新理念、新习惯要不断地重复才能产生效应。这也是现在许多广告不断播报的原因所在。
当然,这里所讲的21天是对新理念、新习惯的中等程度而言的,强度低的、简单的新理念、新习惯的形成就可能会形成的快一些,强度大的、复杂的新理念、新习惯就可能形成的慢一些,这些都有待于进一步深入研究。新理念、新习惯的性质对形成的时间来说也可能会有影响。但目前尚不知影响有多大,也需深入探讨。
此外,旧理念、旧习惯的改变或消退是否也如同新理念、新习惯的形成呢?其机理是否一致?尚不得知。但有一点是明确的,如果这一旧理念、旧习惯就是我们想要改变成新理念、新习惯的,也就是两者的关系是密切相关的,应该说它们是同步的,立的时候,也就是破的时候,也就是说,同样需要21天才会产生效应。
21天效应对学校导学育人来说,实在是太重要了。现在学生的许多不良行为习惯、不良错误观念难以改变,新理念、新习惯难以形成,与我们没有按照21天效应的规律办事很有关系。因此,学校教师要积极应用这一规律,下列是应用时尚需注意的对策:
首先,学校教师要知道习惯、理念具有巨大的作用。 行为科学研究表明,一个人一天的行为中大约只有 5% 是非理念行为,属于非习惯的行为,而剩下的95%的行为都受理念支配,都属习惯性的行为。 由此可见,理念、习惯在一个人行为中的作用是巨大的,这也是一个成功的力量所在。因此,形成良好的新理念、新习惯就显得格外重要,千万不要忽视理念、习惯的作用。
其次,学校教师要相信理念、习惯是可以改变的是可以形成的。我们学校教师中常有人如此感叹:“朽木不可雕也”,也常有“恨铁不成钢”的想法。大量实验与实践证明,只要不断重复,习惯、理念是可以改变的。当然,改变理念、改变习惯会是一个极不舒服、极不情愿的事。但不管怎么说, 人的行为是按理念、习惯行事的,不良的理念、习惯不改变,就可能产生不良的行为,其后果当然是不好的。因此,在改变理念、习惯时,不能因不情愿不舒服就放弃,必要时还要给予外在压力,特别是刚开始时更需如此。 俗话说得好:“万事开头难”,这一炮不打响,后续改变就不可能。因此,要记住改变任何一个理念、习惯时都要不断重复,直至21天,甚至21天以上。相信,没有改变不了的理念和习惯。否则,就意味着失败的来临。
第三,学校教师在改变学生的理念、习惯时,一定要遵循 21 天效应的规律,不能盲干。因此,下列三点尚需引起重视。一是要按照三阶段的形成特点进行理念、习惯的改变工作;二是要有耐心,新理念、新习惯的形成需要21天,甚至更多天;三是在这21天里需要不断地重复练习,不习不得。
*Photo by on
实现了两种方式下载():
就很简单了,将对应小说目录下所有章节合并,写入章节名和章节小说,最后输出合并后的小说。
| |