size_t

C++ string 类详解

余生颓废 提交于 2020-02-16 23:28:52
字符串是存储在内存的连续字节中的一系列字符。C++ 处理字符串的方式有两种,一种来自 C 语言,常被称为 C-风格字符串,另一种是基于 string 类库的字符串处理方式。C 风格字符串的处理可以参考 https://www.cnblogs.com/tongye/p/10688941.html ,本文着重介绍 string 类库的使用。 一、string 类简介   C++ 中提供了专门的头文件 string(注意不是 string.h,这个是 C 风格字符串相关函数的头文件),来支持 string 类型。string 类定义隐藏了字符串的数组性质,让我们可以像处理普通变量那样处理字符串。 string 对象和字符数组之间的主要区别是:可以将 string 对象声明为简单变量,而不是数组 。 1.1 string 类几种常见的构造函数: 1)string(const char *s) :将 string 对象初始化为 s 指向的字符串 string str("Hello!"); 2)string(size_type n,char c) :创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 c string str(10,'a'); 3)string(const string &str) :将一个 string 对象初始化为 string 对象 str

一种简单定长管理的内存池实现

痞子三分冷 提交于 2020-02-13 08:18:43
借鉴ucos消息队列中的实现,对内存池只提供信息的管理头部,由用户管理内存的分配与释放。 借用了STL中的管理思路 typedef union object_t { union object_t *next; //下一个对象 char data[1]; }object_t; 注意其为union类型,next和data复用 typedef struct ares_block { size_t object_size; //单个对象的大小 size_t block_size; //占用的空间总数 size_t count; //剩余有多少个对象 object_t * free_list; //空闲的对象块 char *data; //实际指向缓冲区位置 struct list_head list_block;//多个内存块 }mem_block_t; 基本的管理块 mem_block_t的接口函数。 void memblock_init(mem_block_t *block,size_t object_size,size_t buf_len,char *data); void memblock_destroy(mem_block_t *block); char *memblock_alloc(mem_block_t *block,size_t object_size); void

C++学习之路——string字符串类具体用法

泄露秘密 提交于 2020-02-13 02:13:26
引言: C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。 string 是 C++ 中常用的一个类,它非常重要,我们有必要在此单独讲解一下。 定义 使用 string 类需要包含头文件,下面的例子介绍了几种定义 string 变量(对象)的方法: # include <iostream> # include <string> using namespace std ; int main ( ) { string s1 ; string s2 = "c plus plus" ; string s3 = s2 ; string s4 ( 5 , 's' ) ; return 0 ; } 变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。 变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志’\0’。 变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。 变量 s4 被初始化为由 5 个’s’字符组成的字符串,也就是"sssss"。 从上面的代码可以看出,string 变量可以直接通过赋值操作符=进行赋值

一篇搞定RSA加密与SHA签名|与Java完全同步

烂漫一生 提交于 2020-02-08 09:24:00
基础知识 什么是RSA? 答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名。 RSA加密中padding? 答:padding即填充方式,由于RSA加密算法中要加密的明文是要比模数小的,padding就是通过一些填充方式来限制明文的长度。后面会详细介绍padding的几种模式以及分段加密。 加密和加签有什么区别? 答:加密:公钥放在客户端,并使用公钥对数据进行加密,服务端拿到数据后用私钥进行解密; 加签:私钥放在客户端,并使用私钥对数据进行加签,服务端拿到数据后用公钥进行验签。 前者完全为了加密;后者主要是为了防恶意攻击,防止别人模拟我们的客户端对我们的服务器进行攻击,导致服务器瘫痪。 基本原理 RSA使用“密钥对”对数据进行加密解密,在加密解密前需要先生存公钥(Public Key)和私钥(Private Key)。 公钥(Public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端。 私钥(Private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题。 iOS中的Security.framework提供了对RSA算法的支持,这种方式需要对密匙对进行处理, 根据public key生成证书, 通过private key生成p12格式的密匙

内核第一宏:offsetof宏和container_of宏

你离开我真会死。 提交于 2020-02-06 02:42:00
绪论 通过结构体的整体变量来访问其中的各个元素,形式上是通过 . / -> 来访问,实质上是通过指针方式来访问的(编译器会自动计算偏移量)。在 C/C++ 中,其实可以用一些宏来计算结构体中成员变量与结构体的地址关系,那就是 offsetof宏 和 container_of宏 一、offsetof宏 offsetof 宏:通过虚拟一个 type 类型的结构体变量,然后用 type.member 的方式来访问 member 这个成员变量,继而得到 member 相对于整个变量首地址的偏移量 1.1 offsetof 宏的实现 在C标准库中有对 offsetof 的声明,需包含头文件 stddef.h : size_t offsetof ( type , member ) ; 在 Linux 内核中的实现原理如下: # define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) TYPE 是结构体类型, MEMBER 是结构体中一个成员变量名 宏返回的是 MEMBER 相对于整个结构体变量的首地址的偏移量,类型是 unsigned int(即size_t) 1.2 解析 &((TYPE *)0)->MEMBER 注意:优先级 -> 高于 & (TYPE *)0 是一个强制类型转化,将数字 0 强制类型转换成 TYPE *

(原)测试intel的并行计算pafor

别等时光非礼了梦想. 提交于 2020-02-03 09:55:16
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/4988264.html 参考网址: 关于mt19937: http://www.cnblogs.com/egmkang/archive/2012/09/06/2673253.html 代码如下: 1 #include "stdafx.h" 2 #include <iostream> 3 #include <random> // mt19937的头文件 4 #include <ppl.h> // parfor的头文件 5 #include <windows.h> // QueryPerformanceFrequency等函数的头文件 6 7 using namespace concurrency; // parfor使用 8 using namespace std; 9 10 11 // 分配内存 12 void AllocMatrix(double** m, size_t n) 13 { 14 *m = new double[n*n]; 15 memset(*m, 0, sizeof(double)*n*n); 16 } 17 18 19 // 初始化矩阵内容 20 template <class Gen> 21 void IniMatrix(double* m, size_t n,

C语言动态存储分配

孤街醉人 提交于 2020-01-31 06:09:25
动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串、数组和结构体 本文地址: http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html ,转载请注明源地址。 1、内存分配函数 3种内存分配函数都是声明在<stdlib.h>中: malloc函数--分配内存块,但是不对内存块进行初始化 calloc函数--分配内存块,并且对内存块进行消除 realloc函数--调整先前分配的内存块 malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效 当申请内存块而调用内存分配函数的时候,函数会返回void*型的值。内存中对象的空间大小,是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型,专门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目,类型是size_t 2、空指针 由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值: p=malloc(10000); if(p==NULL) { /*分配失败*/ } 在C语言中,指针测试真假的方法和数的测试一样: if(p==NULL) if(

堆的分配和释放

梦想的初衷 提交于 2020-01-29 23:02:13
1、分配内存 void * malloc( size_t _Size); void * calloc( size_t _Count, size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针。 calloc函数分配内存的同时把内存清空。第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(单位:字 节),calloc自动将分配的内存置0。 2、内存重新分配 void * realloc( void *p, size_t _NewSize); 第一个参数 p为之前用malloc或者calloc分配的内存地址,_NewSize为重新分配内存的大小,单位:字节。成功返回新分配 的堆内存地址,失败返回NULL。 Realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内 存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。 如果参数p等于NULL,那么realloc与malloc功能一致。 3、内存释放 void free(void *p); free负责在堆中释放malloc分配的内存。参数p为malloc返回的堆中的内存地址。 注:再释放完后,将指针置空。 参考:黑马程序员 来源: CSDN

MNN框架学习(三):内存管理

六月ゝ 毕业季﹏ 提交于 2020-01-27 15:07:07
不知道是不是借鉴了NCNN的代码,感觉差不多,具体可以参考大佬对于ncnn内存管理代码的解析,具体见参考资料[1],讲的非常清楚,这里只是做一个学习笔记。 具体代码为source/core/MNNMemoryUtils.c文件: 1、对齐内存分配接口:使用malloc函数 // 使用malloc函数来进行内存分配 // 传入待分配内存大小,及对齐内存大小 void *MNNMemoryAllocAlign(size_t size, size_t alignment) 首先,需要分配原始内存: void **origin = (void **)malloc(size + sizeof(void *) + alignment); 这里多分配的sizeof(void*)用于保存对齐前内存地址;多分配的alignment为了保证对齐后,依然有size大小内存可用;转换成(void**)的原因,是为了后面origin+1直接跳过用于保存对齐前内存地址的预留内存。 然后,对齐分配的内存: static inline void **alignPointer(void **ptr, size_t alignment); 对应实现部分为: (void **)((intptr_t)((unsigned char *)ptr + alignment - 1) & -alignment);

size_t_百度百科

一世执手 提交于 2020-01-27 00:07:40
size_t_百度百科 size_t 编辑本段 概述 size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件 stddef.h 的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。 例如:bitset的size操作返回bitset对象中二进制位中的个数,返回值类型是size_t。 例如:在用下标访问元素时,vector使用vector:: size_type 作为下标类型,而 数组 下标的正确类型则是size_t。 编辑本段 来源 size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。 数据类型"socklen_t"和int应该具有相同的长度,否则就会破坏 BSD套接字层的填充。POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数的长度必须和int一致,因为这是BSD套接字接口标准。最终POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t"。Linus Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。 编辑本段