size_t

STL源码剖析——空间配置器Allocator#2 一/二级空间配置器

喜夏-厌秋 提交于 2019-12-01 07:11:37
  上节学习了内存配置后的对象构造行为和内存释放前的对象析构行为,在这一节来学习内存的配置与释放。   C++的内存配置基本操作是::operator new(),而释放基本操作是::operator delete()。这两个全局函数相当于C的malloc() 和free() 函数。而SGI正是以malloc() 和free() 完成内存的配置与释放。   考虑到小型区块可能造成的内存破碎问题,SGI设计了两级的空间配置器。第一级直接使用malloc() 和free() ,而第二级则视情况采用不同的策略: 当配置区块超过128bytes时,视为足够大,便调用第一级配置器;当配置区块小于128bytes时,视为过小,采用复杂的内存池(memery pool)分配方式,而不再求助于第一级配置器。 我的理解是,容器在分配内存时,无论所需区块多大,它都是调用第二级配置器,而在第二级配置器内再做判断是否求助于第一级配置器。我们可以从这段代码中看到端倪,其中第一级配置器类为__malloc_alloc_template,第二级配置器类为 __default_alloc_template: typedef __malloc_alloc_template<0> malloc_alloc; ... #ifdef __USE_MALLOC ... typedef malloc_alloc alloc;

c++ 内存池

狂风中的少年 提交于 2019-11-30 23:20:52
初始申请内存,将内存分为内存区,各个内存区以链表相连,每个内存区中又有内存块链表 #ifndef UNTITLED5_MEMORY_POOL_H #define UNTITLED5_MEMORY_POOL_H #include<stdint.h> #include <mutex> template<size_t BlockSize,size_t BlockNum =10> class MemoryPool { public: MemoryPool() { std::lock_guard<std::mutex>lock(mtx); free_block_head=NULL; mem_chunk_head=NULL; } ~MemoryPool() { std::lock_guard<std::mutex> lk(mtx); MemChunk *p; while(mem_chunk_head)//循环链表删除内存区 { p=mem_chunk_head->next; delete mem_chunk_head; mem_chunk_head= NULL; mem_chunk_head=p; } } void *allocate()//分配空间 { std::lock_guard<std::mutex>lk(mtx); if(!free_block_head) {//首内存块为空

NetEQ主要文件简介

微笑、不失礼 提交于 2019-11-30 19:28:33
accelerate.h , accelerate.cc 加速操作,对语音信号处理以实现快速播放。 Accelerate 类继承自父类 TimeStretch ,大多数功能由 TimeStretch 实现。 ReturnCodes Process(const int16_t* input, size_t input_length, bool fast_accelerate, AudioMultiVector* output, size_t* length_change_samples); 从|input|中读入长度为|input_length|的样本点;输出到算法缓冲区|output|中;改动的样本点数为|length_change_samples|;当fast_accelerate设置为True时,将删除更多的样本点,这有可能会导致删除多个音高周期。函数返回枚举值 RetureCodes ,表明操作的状态。 附: ReturnCodes 定义: enum ReturnCodes { kSuccess = 0, kSuccessLowEnergy = 1, kNoStretch = 2, kError = -1 }; audio_multi_vector.h , audio_multi_vector.cc 算法缓冲区 AudioMultiVector 的实现: std:

[C++学习]数组

浪子不回头ぞ 提交于 2019-11-30 05:41:20
一、描述 数组是一种类似于vector的复合类型,但与vector不同的是,数组的大小确定不变,不能随意向数组添加元素。 二、定义和初始化 数组声明形如a[b],b必须为常量表达式并且大于0。 unsigned s = 4; // 不是常量表达式 constexpr unsigned size = 4; // 常量表达式 int a1[4]; // 含有4个整数的数组 int a2[s]; // 错误写法: s不是常量表达式 int a3[size]; // 含有4个整数的数组 默认情况下,数组的元素被默认初始化,默认初始化会令数组含有未定义的值。定义时必须确定数组类型,不能使用auto关键字。与vector一样,数组是一个对象,所以不存在引用的数组。 显式初始化 int a1[3] = {1, 2, 3}; // 含3个元素,分别是1,2,3 int a2[] = {1, 2, 3}; // 含3个元素,分别是1,2,3 int a3[5] = {1, 2, 3}; // 含5个元素,分别是1,2,3,0,0 string a4[3] = {"hello", "world"}; // 含3个元素,分别是"hello","world"和"" 字符数组 字符数组有一种额外的初始化形式:可以利用字符串字面值对此类字符串进行初始化。这种方法会在字符串字面值结尾处多一个空字符'\0'

Std C Library

陌路散爱 提交于 2019-11-30 03:37:19
//*****************************************// // STD C 库 // //*****************************************// <assert.h> Macro: void assert(int expression) //在debug时使用,诊断功能 它可用于验证程序做出的假设,并在假设为假时输出诊断消息。 --------------------------------------------------- 宏定义如下: #define assert(ignore) ((void)0) <limit.h> Macro: CHAR_BIT 8 定义一个字节的比特数。 SCHAR_MIN -128 定义一个有符号字符的最小值。 SCHAR_MAX 127 定义一个有符号字符的最大值。 UCHAR_MAX 255 定义一个无符号字符的最大值。 CHAR_MIN 0 定义类型 char 的最小值,如果 char 表示负值,则它的值等于 SCHAR_MIN,否则等于 0。 CHAR_MAX 127 定义类型 char 的最大值,如果 char 表示负值,则它的值等于 SCHAR_MAX,否则等于 UCHAR_MAX。 MB_LEN_MAX 1 定义多字节字符中的最大字节数。 SHRT_MIN -32768

纯C语言(C89)实现简单链表

老子叫甜甜 提交于 2019-11-30 02:20:39
起因 工作很少接触纯C项目,业余写着玩玩,不断雕琢 目标 纯C实现简单链表,提供方便易用泛型接口,避免依赖 实现 完全封装,隐藏结构体细节,不支持栈创建 拷贝存储,轻微性能代价换来易用性 list.h #ifndef LIST_H #define LIST_H #include <stddef.h> typedef struct ListItem_ ListItem; typedef struct List_ List; List* list_new(); void list_free(List* l); size_t list_length(List* l); ListItem* list_head(List* l); ListItem* list_tail(List* l); ListItem* list_next(ListItem* e); size_t list_data(ListItem* e, void** data); int list_insert_next(List* l, ListItem* e, void* data_in, size_t size); int list_remove_next(List* l, ListItem* e); #endif // LIST_H list.c #include "list.h" #include <stdlib.h>

C89实现动态数组

天涯浪子 提交于 2019-11-29 21:24:57
起因 已经很少接触纯C语言项目,不过本着大道至简的念头,空暇时间可以写着玩玩,雕琢技艺, 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现一 vector.h #ifndef VECTOR_H #define VECTOR_H #include <stddef.h> struct Vector_; typedef struct Vector_ Vector; Vector* vector_new(size_t elem_size); void vector_destory(Vector* v); size_t vector_length(Vector* v); void vector_append(Vector* v, void* elem_in); void vector_get(Vector* v, size_t pos, void* elem_out); void vector_set(Vector* v, size_t pos, void* elem_in); #endif // VECTOR_H vector.c #include <stdlib.h> #include <string.h> #include "vector.h" #define DEFAULT_VECTOR_SIZE 10 typedef unsigned char byte;

#define list_entry(ptr, type, member) \   container_of(ptr, type, member)

寵の児 提交于 2019-11-29 17:57:31
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 该宏在 Linux内核 代码(版本2.6.22)中定义如下: #define offsetof(TYPE, MEMBER) (( size_t ) &((TYPE *)0)->MEMBER); 分析: (TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0,这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转 换为 size_t 型的就OK了, size_t 其实也就是int。 typedef __kernel_size_t size_t; typedef unsigned int __kernel_size_t; 可见,该宏的作用就是求出MEMBER在TYPE中的偏移量。 关于typeof,这是gcc的C语言扩展保留字,用于声明变量类型. const typeof( ((type *)0

c++ new和delete简单探索

谁说我不能喝 提交于 2019-11-29 16:36:09
c++ new和delete简单探索 1. new 和 delete 工作步骤 new: 使用标准库函数 operator new 或者 operator new[] 在堆内存中分配出一块足够大的内存 调用相应的构造函数构造出对象并赋初值,对象安排在步骤1的内存上 返回指向这块内存的指针 delete: 调用对象的析构函数 调用标准库函数 operator delete 或者 operator delete[] 释放空间。 在new分配内存失败后会调用new-handler处理: new_handler介绍 2. 用户可以重载operator new来实现自己的new方式 // 默认是static的 void * operator new ( std : : size_t count ) ; void * operator new [ ] ( std : : size_t count ) ; 重载 operator new 可以分为全局作用域和类作用域 重载类作用域的 operator new class Base { public : Base ( ) { cout << "Base()" << endl ; } ~ Base ( ) { cout << "~Base()" << endl ; } void * operator new ( size_t p ) { //

iOS加密之AES

你说的曾经没有我的故事 提交于 2019-11-28 20:07:28
心急的童鞋直接看这里 Demo 运行之后可以去在线加密 网站 验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES AES的五种加密模式 AES有五种加密模式(CBC、ECB、CTR、OCF、CFB) 1.电码本模式(Electronic Codebook Book (ECB) 2.密码分组链接模式(Cipher Block Chaining (CBC)) 3.计算器模式(Counter (CTR)) 4.密码反馈模式(Cipher FeedBack (CFB)) 5.输出反馈模式(Output FeedBack (OFB)) 在iOS用到的一般就是ECB和CBC两种。 ECB-电码本模式 ECB是最简单的块密码加密模式,加密前根据加密块大小(AES加密块固定为128位)分成若干块,之后将每块使用相同的密钥单独加密,所以加密块相同的明文会生成相同的密文。 CBC-密码分组链接模式 CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。 OK,最简单的理论理解了,就来看iOS最重要的干货:加解密函数 CCCrypt CCCrypt - 加解密函数 CCCryptorStatus