
C++
HeMiJack
这个作者很懒,什么都没留下…
展开
-
placement new
如果有这样一个需求:使用一块内存存储一种类型的对象,很快就能使用完。然后还需要一块内存存储另一种类型的对象,还是很快使用完。那么一般的操作时使用多块内存,但是多块内存的问题是,多次new和free,效率不高;另外,多块内存占用空间大。如果上述过程是一个有先后顺序的,那么可以使用一块内存来满足。相当于首先预申请了一块内存,依次为此块内存指定某种类型的对象,指定的过程是会执行对象构造的,使用完后再对此对象进行析构。当确定不再使用这块内存时,再回收此内存上述现象,可以使用placement new来实现语.原创 2021-05-26 15:08:43 · 129 阅读 · 0 评论 -
C++11新特性: list initialization
C++ 11 提供了一种列表初始化方式,可以作用域任何类型对象的初始化,包括内置类型,自定义类型等list initialization实际上就是{}的形式,或者叫大括号~同时,list initialization还可以作为assignment expression来使用(ref:cppreference )举例几种list initialization的使用方法Struct S{,,,};//结构体的list initializationClass C{,,,};//类的list init.原创 2021-04-25 00:09:22 · 365 阅读 · 0 评论 -
C++ 模板
模板形参可以是Type parameter,也可以是NonType parameter模板实例化在编译阶段,因此Type parameter需要在编译阶段就确定,同样地NonType parameter也需要在编译阶段确定具体值内联inline 需要放在模板形参表之后,template <typename T> inline T min(const T&, const T&)模板函数的非类型模板形参模板函数的模板形参可以是具体的值,实例化时使用具体的值来代替非.原创 2021-04-01 20:10:06 · 388 阅读 · 0 评论 -
调用约定:__cdecl, __stdcall, __fastcall
__cdeclC/C++默认的调用约定参数从右至左顺序入栈函数调用完成后由调用者负责清栈。如printf函数等参数个数可变,则必须由调用者清栈,所以printf必须使用__cdecl形式调用约定。因为由调用者负责清栈,所以编译的代码需要包含清栈部分操作,所以编译结果的文件较大C编译器函数名称修饰规则:"__functionName"C++编译器函数名称修饰规则:"?functionName@@YA******@Z",其中******为函数返回值类型和参数类型表__stdcallwi.原创 2021-01-04 22:41:21 · 198 阅读 · 0 评论 -
C++中的类型转换:static_cast/dynamic_cast/const_cast/reinterpet_cast
static_caststatic_cast<type_id>(expression),使用type_id将expression类型转换static_cast 运算符可用于将指向基类的指针转换为指向派生类的指针等操作。 此类转换并非始终安全。通常使用 static_cast 转换数值数据类型,例如将枚举型转换为整型或将整型转换为浮点型,而且你能确定参与转换的数据类型static_cast 转换安全性不如 dynamic_cast 转换,因为 static_cast 不执行运行时类型检.原创 2020-12-28 16:58:52 · 285 阅读 · 0 评论 -
前向声明(forward declaration)
● 结构体类型S在声明之后定义之前是一个不完全类型(incomplete type),即已知S是一个类型,但不知道包含哪些成员。● 不完全类型只能用于定义指向该类型的指针,或声明使用该类型作为形参指针类型或返回指针类型的函数。指针类型对编译器而言大小固定(如32位机上为四字节),不会出现编译错误。假设先后定义两个结构A和B,且两个结构需要互相引用。在定义A时B还没有定义,则要引用B就需要前向声明结构B(struct B;)。示例如下:typedef BOOL (*func)(const DefStru原创 2020-12-04 21:48:14 · 4293 阅读 · 0 评论