size_t

memcpy和memmove使用区别

余生长醉 提交于 2019-12-09 15:11:13
memcpy函数原型 void * memcpy ( void * dest , const void * src , size_t n ) ; man手册描述:memcpy()函数从内存区域src复制n个字节到内存区域dest。内存区域不能重叠。如果内存区域重复使用memmove memcpy实现 void * memcpy ( void * dest , const void * src , size_t n ) { char * dp = dest ; const char * sp = src ; while ( n -- ) * dp ++ = * sp ++ ; return dest ; } memmove函数原型 void * memmove ( void * dest , const void * src , size_t n ) ; man手册描述:memmove()函数将n个字节从内存区域src复制到内存区域dest 首先将字节复制到不重叠的src或dest的临时数组中,然后将这些字节从临时数组复制到dest。 memmove实现 ```handlebars void * memmove ( void * dest , const void * src , size_t n ) { unsigned char tmp [ n ] ; memcpy ( tmp

条款52:写了placement new也要写placement delete

我只是一个虾纸丫 提交于 2019-12-07 07:58:51
条款52:写了placement new也要写placement delete Write placement delete if you write placement new. 我们都知道当你在写一个new表达式像这样: Widget* new_widget = new Widget; 共有两个函数被调用:一个是用以分配内存的operator new,一个是Widget的default构造函数. 那么假设我们现在遇到的情况是:第一个函数调用成功,第二个函数却抛出异常.按照常理,在步骤一中所分配的 内存必须取消,否则就会造成内存泄露.而在这个时候客户已经没有能力归还内存了,因为手上没有指向这块内存的 指针,故此任务就落到了C++运行期系统身上. 为了完成任务,运行期系统当然就会调用步骤一所用的operator new的相应operator delete版本.如果当前要处 理的是拥有正常签名的new和delete版本,这好办!因为正常的operator new签名式: void* operator new(std::size_t) throw (std::bad_alloc); 对应的正常的operator delete签名式: void operator delete(void* raw_memory)throw();//global 作用域中的正常签名式 void

malloc的原理

霸气de小男生 提交于 2019-12-07 07:44:20
任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一 段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统 所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的 基本 思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解。 这篇文章通过实现一个简单的malloc来描述malloc背后的机制。当然与现有C的标准库实现(例如glibc)相比,我们实现的malloc 并不是特别高效,但是这个实现比目前真实的malloc实现要简单很多,因此易于理解。重要的是,这个实现和真实实现在基本原理上是一致的。 这篇文章将首先介绍一些所需的基本知识,如操作系统对进程的内存管理以及相关的系统调用,然后逐步实现一个简单的malloc。为了简单起见,这篇文章将只考虑x86_64体系结构,操作系统为Linux。 1 什么是malloc 2 预备知识 2.2.1 内存排布 2.2.2 Heap内存模型 2.2.3 brk与sbrk 2.2.4 资源限制与rlimit 2.1.1 虚拟内存地址与物理内存地址 2.1.2 页与地址构成 2.1.3 内存页与磁盘页 2.1 Linux内存管理 2.2 Linux进程级内存管理

String 库函数部分函数源码

有些话、适合烂在心里 提交于 2019-12-06 12:30:12
* linux/lib/string.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * stupid library routines.. The optimized versions should generally be found * as inline code in <asm-xx/string.h> * * These are buggy as well.. * * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de> * - Added strsep() which will replace strtok() soon (because strsep() is * reentrant and should be faster). Use only strsep() in new code, please. */ #include <linux/types.h> #include <linux/string.h> #include <linux/ctype.h> #include <malloc.h> /** * strncasecmp - Case insensitive, length-limited string comparison *

将 C++ Qt 程序移植至 Linux 系统

不问归期 提交于 2019-12-05 16:56:12
前言 Qt 的安装 选择对应版本 更改文件的属性使得其具有可执行性 执行程序 检查 Qt Creator 是否勾选 进入 Qt Creator Qt 环境的配置 安装 gcc 或 g 编译器 编译器错误 ICE in gen_type_die_with_usage 更新 g C 在 MSVC 与 GNU G上的不同之处 enum 的前置声明 size_t 与 stdsize_t auto 推断函数返回值 函数返回数组问题 其他问题 初始化顺序 warning will be initialized after -Wreorder 替换 INT_MAX 和 INT_MIN 感想 前言 前段时间,我一直在使用 Visual Studio 编写一个 C++ Qt 游戏小程序: https://github.com/lgasyou/SimpleSimulator 。突然有一天,我想看看它的可移植性到底如何,于是我把它转化成 .pro 并移至了 Ubuntu 14.04 系统中,之后就开始了漫长的配置之旅。 Qt 的安装 1. 选择对应版本 可以前往 Qt 的官方网站根据CPU架构类型和版本号的不同选择 qt-opensource-linux-CPU架构类型-任意版本号.run 下载,例如需在 32 位系统下下载版本号为 5.8.0 时的 Qt 则选择 qt-opensource-linux

STL hash function的模板特化

妖精的绣舞 提交于 2019-12-05 15:32:41
哈希函数的作用是将一个值映射为一个哈希值,从而根据这个哈希值,在哈希表中对数据进行定位。 template <class _Val, class _Key, class _HashFcn, class _ExtractKey, class _EqualKey, class _Alloc = alloc> class hashtable; STL中定义的hashtable容器包含哈希函数模板参数_HashFcn。_HashFcn既然是一个类类型,又能提供函数的功能,因此是一种仿函数(functor); 仿函数是一个类,在类中重载()运算符,从而由仿函数类对象即可实现函数功能。 在SGI-STL中的stl_hash_fun.h中定义了若干仿函数类: #ifndef __SGI_STL_HASH_FUN_H #define __SGI_STL_HASH_FUN_H #include <stddef.h> __STL_BEGIN_NAMESPACE template <class _Key> struct hash { }; inline size_t __stl_hash_string(const char* __s) { unsigned long __h = 0; for ( ; *__s; ++__s) __h = 5*__h + *__s; return size_t(__h);

malloc和cmalloc

限于喜欢 提交于 2019-12-05 12:07:12
void *malloc(size_t size); 分配内存,但不会初始化,未使用内存不一定是0;void *calloc(size_t numElements,size_t sizeOfElement); 分配内存并初始化,未使用内存为0; 来源: https://www.cnblogs.com/nanfei/p/11923937.html

文件打包学习1

只愿长相守 提交于 2019-12-05 11:49:03
打包的定义   什么是打包?打包这个词很形象,就是把零碎的文件进行统一重封装,统一管理,比如我们常见的RAR文件,ZIP文件都是很常见的包裹格式 打包的意义 比如RAR包,我们虽然能有工具解压,但是我们却基本上没有相关的SDK来做二次开发 ZIP包虽然有SDK来读取,但是对于通用的文件格式,我们无法做到保护资源的需求 如果只是为了文件管理的方便,无所谓别人解开资源的话,直接用现成的ZIP开发的SDK即可 打包的方式 分类打包 比如图片资源打一个包,声音资源打一个包 全部打包 把所有资源一起打包 打包的一般准则和规范 原始文件的标识,这个标识可以使原始文件名+路径名,或者也可以是转换后的数据如ID等,先从最简单的说起,使用原始文件名+路径名 原始文件的大小,把文件打进包裹之后,我们要知道这个原始文件有多大 原始文件的数据打包在包裹的什么位置 打包程序的实现框架 包裹文件的定义 添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数 CreatePackage(创建空白包裹)函数的实现 AddFileToPackage(添加一个文件到包裹)函数的实现 package.h #pragma once #include <cstdio> #include <vector> /* * 根据分析得知,我们需要将多个文件打包一个文件中

Ansi与Unicode及慎用W2A等

允我心安 提交于 2019-12-04 20:54:47
Ansi与Unicode简要说明及各自的优缺点 他们是两种字符的编码格式,Ansi=窄字节,Unicode=宽字节,Ansi用char格式表示一个字符,占用一个字节的存储空间,最多表示255个字符, 表示英文还可以,但对于中文、日文、韩文等语言来说就不够用了,所以如果你的程序是Ansi编码的话, 那么你写的中文语言的程序拿到日文、韩文等系统上面就会出现乱码。所以有了Unicode,用二个字节去表示一个字符,格式是 unsigned short,被定义成 wchar_t 格式 这样就可以表示世界上绝大多数的语言了!但有利就有弊,缺点呢?就是空间占用翻倍了,网络传输的数据量也增大了…… ◆ vc++ 6.0 默认为Ansi编码,vs2005、vs2008、vs2010 等默认都是Unicode编码,当然可以进行工程的设置从而进行编码的转换,见演示! ◆ 就我个人观点:还是建议大家使用Unicode宽字节的编码格式,具体见下面: ◆ 系统提供了两种类型的 API 函数,见:user32.dll 中的 MessageBox 函数,其实 MessageBox 他只是一个宏,他对应的两个版本的函数分别为:MessageBoxA 和 MessageBoxW,你在使用的时候系统会根据是否定义了_UNICODE 宏来进行判断该使用哪个版本的函数!如果你的工程没有定义_UNICODE 宏

内存池实现与分析

假装没事ソ 提交于 2019-12-03 21:16:43
内存池实现与分析 描述 程序中不可避免的因为需要动态分配内存,而大量使用堆上的内存。如果使用系统默认的函数new/delete或malloc/free来分配和释放堆上的内存,效率不高,同时还可能产生大量的内存碎片,导致长时间运行后性能愈发下降。为了提高性能,通常就需要考虑使用一些数据结构和算法来减少动态分配的发生,这也是内存池这个思想的来源。 在我们的服务器里,可以看到大量频繁申请和销魂内存的情况发生在接收处理网络数据的部分里,所以在这一部分的处理中我们就需要考虑使用内存池来优化性能。 算法思想 首先使用的方法是类似 SGI STL 中的 allocator 内存分配器的实现方式。设计了一个数组,负责管理内存页(MemPage)。每一个内存页都可分配连固定大小,范围在 8Bytes 到 64MBytes 之间的内存块。 内存块是在创建MemPage申请的一段连续大小的空间,同时另外用一个数组记录每个块所在的内存地址,分配的时候分配空闲的内存空间,释放的时候通过修改数组指向的位置达到释放的目的。 结构如下: 实现细节 首先定义的结构大小限制如下: #define _MIN_BLOCK_SIZE_ (8) //单内存块最小限制为8 Byte #define _MAX_BLOCK_SIZE_ (1 << 26 ) //单内存块最大限制为64 MByte #define _PAGE_MIN